Wie benenne ich mehrere Dateien um, indem ich das Wort im Dateinamen ersetze?

36

Ersetzen Sie ACDC durch AC-DC

Zum Beispiel haben wir diese Dateien

ACDC - Rock N 'Roll ist keine Lärmbelästigung.xxx

ACDC - Rocker.xxx

ACDC - Shoot To Thrill.xxx

Ich möchte, dass sie werden:

AC-DC - Rock N 'Roll ist keine Lärmbelästigung.xxx

AC-DC - Rocker.xxx

AC-DC - Shoot To Thrill.xxx

Ich weiß, dass für diese Operation sed oder awk verwendet wird. Ich kann nichts googeln und bitte um Hilfe =) Könnten Sie bitte den vollständigen Shell-Befehl für diese Aufgabe angeben?

Feedback: Lösung für OSX-Benutzer

holms
quelle
1
Ich habe das Gefühl, dass es hier eine größere Frage gibt - versuchen Sie, MP3-Dateinamen im Allgemeinen zu reparieren? Es gibt eine Reihe von Skripten, die über die Jahre geschrieben wurden, um dies zu tun. Ich glaube, einer, den ich benutzt habe, hieß mp3fixer.
Phil Hollenback
nein , es geht nicht um MP3-Dateien muss ich nur noch einige große Dateien mit ähnlichen Namen verwalten, und muss etwas alles ersetzt oder feste ... häufige Situation werden , damit ich für die Umbenennung alle von ihnen diese raffinierte Lösung benötigen
Halligen

Antworten:

45
rename 's/ACDC/AC-DC/' *.xxx

von man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

Um beispielsweise alle Dateien umzubenennen, die mit "* .bak" übereinstimmen, um die Erweiterung zu entfernen, könnten Sie sagen

rename 's/\.bak$//' *.bak

Um Großbuchstaben in Kleinbuchstaben zu übersetzen, verwenden Sie

rename 'y/A-Z/a-z/' *
Joel K
quelle
5
Beachten Sie, dass viele Linux-Rechner mit einer Umbenennung von util-linux geliefert werden, die eine einfache Ersetzung und keine regulären Ausdrücke implementiert. Wenn die Umbenennung ohne weitere Schritte fehlschlägt, verwenden Sie wahrscheinlich die falsche rename.
Phil Hollenback
Ich habe lange danach gesucht! Danke!
Holms
@PhilHollenback Wie finde / installiere ich dann das richtige? :)
Henry
Es funktioniert nicht, wenn ich statt Leerzeichen Unterstriche in meinen Dateinamen habe - wie kann ich das lösen?
13.
13

Diese Antwort enthält die guten Teile von allen anderen Antworten, wobei die Häresie wie weggelassen wird ls | while read.

Aktuelles Verzeichnis:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Einschließlich Unterverzeichnisse:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Es ist sehr unwahrscheinlich, dass sich Zeilenumbrüche in Dateinamen befinden. Dies kann einfacher sein, wenn Sie weiterhin mit Namen arbeiten, die Leerzeichen enthalten:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done
Grawity
quelle
9

So verwenden Sie die Util-Linux-Version, auf renamedie sich Phil bezieht (unter Ubuntu heißt sie rename.ul):

rename ACDC AC-DC ACDC*

oder

rename.ul ACDC AC-DC ACDC*
Bis auf weiteres angehalten.
quelle
1
deine variante ist die beste =) so viele dumme artikel in google über find and send und awk ... zu dieser einfachen bedienung für die renameutils egxist schon!
Holms
4

Verwendung der Bash-Shell

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

Hinweis: Mit findwird das aktuelle Verzeichnis und die Verzeichnisse unter verarbeitet.

Ring-Ø
quelle
1

Kommt auf deine Muschel an. In zsh würde ich das machen:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

Wahrscheinlich nicht die beste Lösung, aber funktioniert.

Polemon
quelle
1

Bash benutzen:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

Wenn Sie das renameProgramm installiert haben:

rename 's/ACDC/AC-DC/' *.xxx
ThatGraemeGuy
quelle