Frage Wie man mehrere Dateien umbenennt, indem er Wort im Dateinamen ersetzt?


Ersetzen Sie ACDC durch AC-DC

Zum Beispiel haben wir diese Dateien

ACDC - Rock'n'Roll ist keine Lärmbelastung.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 sed oder awk für diese Operation verwendet wird. Ich kann nichts googlen, also frage ich nach deiner Hilfe =) Könntest du bitte einen voll funktionsfähigen Shell-Befehl für diese Aufgabe bereitstellen?

Feedback: Lösung für OSX-Benutzer


33
2018-01-30 08:00


Ursprung


Ich spüre, dass es hier eine größere Frage gibt - versuchen Sie MP3-Dateinamen im Allgemeinen zu reparieren? Es gibt eine Reihe von Skripten, die Leute über die Jahre geschrieben haben, um dies zu tun. Ich glaube, eine, die ich benutzt habe, wurde genannt mp3fixer. - Phil Hollenback
Nein, es geht nicht um mp3's Ich muss nur einige riesige Dateien mit ähnlichen Namen verwalten, und irgendetwas muss ersetzt oder repariert werden ... allgemeine Situation, also brauche ich diese raffinierte Lösung um alle umzubenennen - holms


Antworten:


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 "* .bak" entsprechen, um die Erweiterung zu entfernen, könnten Sie sagen

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

Um Großbuchstaben in niedrigere zu übersetzen, würden Sie verwenden

rename 'y/A-Z/a-z/' *

43
2018-01-30 08:11



Beachten Sie, dass viele Linux-Rechner mit dem Namen util-linux umbenannt werden, der eine einfache Ersetzung implementiert, nicht Regexes. Wenn also die Umbenennung fehlschlägt, ohne etwas zu tun, verwenden Sie wahrscheinlich das Falsche rename. - Phil Hollenback
Ich habe das schon ewig gesucht! thnx! - holms
@PhilHolleback Wie finde ich dann den richtigen? :) - henry


Diese Antwort enthält die guten Teile von allen anderen Antworten, während sie solche Häresie wie ls | while read.

Aktuelles Verzeichnis:

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

Unterverzeichnisse einschließen:

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

Newline-Zeichen sind Ja wirklich Es ist unwahrscheinlich, dass sie sich in Dateinamen befinden. Dies kann einfacher sein, wenn Sie noch mit Namen arbeiten, die Leerzeichen enthalten:

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

13
2018-01-30 09:03





Um die util-linux-Version von rename auf die sich Phil bezieht (auf Ubuntu heißt es rename.ul):

rename ACDC AC-DC ACDC*

oder

rename.ul ACDC AC-DC ACDC*

7
2018-01-30 11:14



deine variante ist das beste =) so viele blöde artikel in google über find und send und awk ... zu dieser einfachen bedienung für die renameutils egxist schon! - holms


Verwenden 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: Verwenden find verarbeitet das aktuelle Verzeichnis und die Verzeichnisse darunter.


4
2018-01-30 08:24





Hängt von deiner Schale ab. In zsh würde ich das tun:

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.


1
2018-01-30 08:09





Bash verwenden:

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

Wenn du das hast rename Programm installiert:

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

1
2018-01-30 08:16