Wie werden Dateinamen mit vorangestelltem Text versehen?


44

Nehmen wir an, ich habe ein Verzeichnis voller .mdDateien mit verschiedenen Namen. Nehmen wir an, ich wollte jedem Dateinamen "Text" voranstellen. So zum Beispiel: Datei a.md, b.mdund c.mdwürde test - a.md, test - b.mdund test - c.md.

Wie würde ich das über die Kommandozeile erreichen?

Antworten:


60

Einzeiler, der einfach direkt vom Terminal eingegeben werden kann:

for f in *.md; do mv "$f" "test - $f"; done

Oder in separaten Zeilen mit Semikolons umschreiben:

for f in *.md
do
    mv "$f" "test - $f"
done

Exposition

Syntax von for(in sh):

for NAME [in WORDS ... ] ; do COMMANDS; done

Hier stimmen unser NAMEist fund unser WORDSsind alle Dateien im aktuellen Verzeichnis überein *.md. Die Variable $fwird also durch jede übereinstimmende Datei ersetzt *.md.

Also für a.md:

mv "$f" "test - $f"

wird

mv "a.md" "test - a.md"

Die Anführungszeichen sind wichtig, da jeder Dateiname $fLeerzeichen enthalten kann. Ansonsten mvwürde ich denken, jedes Wort wäre eine eigene Datei. Wenn zum Beispiel keine Anführungszeichen vorhanden Foo Bar.mdwären und eine Datei mit dem Namen vorhanden wäre , würde dies folgendermaßen übersetzt:

mv Foo Bar.md test - Foo Bar.md

das würde nicht so funktionieren wie beabsichtigt. Aber durch das Einschließen $fvon Anführungszeichen macht es Sinn:

mv "Foo Bar.md" "test - Foo Bar.md"

Unter Berücksichtigung der Syntax von forkönnen Sie auch eine Teilmenge aller *.mdDateien umbenennen, indem Sie jede explizit benennen:

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

Oder mit Shell-Erweiterung:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done

Genau das musste ich sehen. Vielen Dank!
Ryan

11

Wenn Sie haben prename...

prename 's/^/test - /' *.md

Verwenden gewöhnlicher Shell-Befehle:

for file in *.md; do
    mv "$file" "test - $file"
done

Wie bekomme ich prename?
17.

Scheint für mich auf Ubuntu 16.04 LTS vorinstalliert zu sein. Haben Sie Ihren Paketmanager ausprobiert sudo apt-get install?
Orion751

5

mmv1 , 2 ist auch ein sehr schönes Werkzeug für eine solche Aufgabe, angewendet auf den aktuellen Job, wäre es

mmv '*.md' 'test - #1.md'

Natürlich, wenn Sie nur "test -" zu a.md, b.md und c.md hinzufügen möchten, aber nicht a1.md, so etwas wie

mmv '?.md' 'test - #1.md'

wäre angemessener.

Ich kann es wirklich empfehlen, besonders wenn Sie viele solche Probleme haben.

Wenn Sie zusätzlich nach einer grafischen Oberfläche suchen, versuchen Sie es mit gprename .


5

Anstatt eine for-Schleife zu verwenden, die bei Leerzeichen fehlschlägt, sofern Sie die IFS-Variable nicht neu definieren, würde ich die Verwendung einer while-Schleife in Kombination mit find empfehlen. Das Folgende funktioniert, wenn es im selben Verzeichnis wie die Dateien ausgeführt wird

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done

Die Zeile "basename" befindet sich dort, sodass find nur den Dateinamen ausgibt - ohne Pfadkomponenten, die den Umbenennungsvorgang unterbrechen würden.


2

Ich weiß, dass es sehr spät ist, aber wenn jemand anderes so etwas sucht, dann hat das bei mir funktioniert:

rename '' 'name -' *.md

1
Einfach und unkompliziert
user13743

0

Wenn Sie zshverfügbar sind, können Sie Folgendes verwenden zmv:

autoload zmv
zmv -w '*' 'test - $1'

Sie können den Befehl testen mit:

zmv -wn '*' 'test - $1'
  • -n bedeutet Trockenlauf, dh nur zeigen, was passieren wird.
  • -w Platzhalter werden implizit in Klammern gesetzt, und Rückverweise funktionieren.

0

Fügen Sie in bash allen Dateien im Ordner "Text voranstellen -" hinzu:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;

Dies ist eine super lange Schreibweisefor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.