it-swarm.com.de

Wie benenne ich mehrere Dateien um, indem ich Word durch den Dateinamen ersetze?

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ärmbelastung.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 googeln und bitte um Ihre Hilfe =) Könnten Sie bitte einen voll funktionsfähigen Shell-Befehl für diese Aufgabe bereitstellen?

Feedback: Lösung für OSX-Benutzer

37
holms
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.

Wenn Sie beispielsweise alle Dateien umbenennen möchten, die mit "* .bak" übereinstimmen, um die Erweiterung zu entfernen, können Sie sagen

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

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

rename 'y/A-Z/a-z/' *
46
Joel K

Diese Antwort enthält die guten Teile aller anderen Antworten, wobei Häresien wie 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

Zeilenumbruchzeichen sind wirklich unwahrscheinlich in Dateinamen enthalten, daher kann dies 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
user1686

Um die Util-Linux-Version von rename zu verwenden, auf die sich Phil bezog (unter Ubuntu heißt sie rename.ul):

rename ACDC AC-DC ACDC*

oder

rename.ul ACDC AC-DC ACDC*

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: Wenn Sie find verwenden, werden das aktuelle Verzeichnis und die Verzeichnisse unter verarbeitet.

4
Ring Ø

Kommt auf deine Shell an. 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, funktioniert aber.

1
polemon

Bash verwenden:

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

Wenn Sie das Programm rename installiert haben:

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