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?

Jesse Atkinson
quelle

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
QuasarDonkey
quelle
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
Grawity
quelle
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 .

Claudius
quelle
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.

Fred Clausen
quelle
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
nullptr
quelle
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.
Thor
quelle
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;
Osiris
quelle
Dies ist eine super lange Schreibweisefor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby