Wie benenne ich viele Dateien in der Bash-Shell um?

Wie benenne ich viele Dateien in der Bash-Shell um?

Entschuldigen Sie die Frage. Ich habe viel im Internet gesucht, konnte aber keine passende Antwort finden (obwohl es viele Vorschläge gab).

Ich möchte also VIELE Dateien umbenennen. Alle Dateinamen aufzuschreiben ist keine Option. Die Dateien werden folgendermaßen benannt:

HAUPT_SIA_039.MR.NEUROPSYCHOLOGIE_LOGIN.0003.0001.2014.03.28.14.49.59.511530.47117493.IMA

der Anfang ist immer gleich und auch die .IMA Die lange Nummer ist nicht bei allen Dateien gleich. Ich muss die 039 in 036_2 ändern, für alle Dateien. Der Rest sollte gleich bleiben.

Ich habe alle der folgenden Befehle (und mehrere andere) ausprobiert, aber es hat nichts bewirkt:

cd my_directory

rename 's/\w039_2\w/\w036_2\w/g' * 

rename ?039_2? ?036_2? ?0_39_2?.IMA

rename 's/?039_2?/?036_2?/' ?039_2?.IMA

rename 's/\w039_2\w/\w036_2\w/' ?039_2?.IMA

Perl ist auf dem Linux-System installiert (aber ich bin nicht sicher, wie ich es aufrufe, denn wenn ich ein Perl-Terminal öffne, passiert nichts).

Kannst du mir helfen?

Antwort1

for file in * ; do mv $file $(echo $file | sed 's/_039/_036_2') ; done

Erläuterung:

for file in * ; do _______ ; done

bash führt eine Shell-Erweiterung aus, *um alle Dateien im Arbeitsverzeichnis aufzulisten. Für jede dieser Dateien setzt diese Befehlsstruktur die Variable fileauf den Dateinamen und führt den Befehl zwischen ; dound aus.; done

mv $file _______

mvist die traditionelle Art, Dateien in Unix/Linux umzubenennen. Es wird umbenannt filein_______

echo $file | sed 's/_039/_036_2'

echo $file | sedsendet einfach " file" an die Standardeingabe von sed, wobei sed"_036_2" durch "_039" ersetzt wird.

Insgesamt: Benennen Sie jede Datei im aktuellen Verzeichnis um und ersetzen Sie "_036_2" durch "_039".

Antwort2

Ihr regulärer Ausdruck ist durcheinander. Hier ist einer, der funktionieren sollte.

rename 's/HAUPT_SIA_039[.]\(.*\)/HAUPT_SIA_039_2.\1/g' HAUPT_SIA*.IMA

Sie verwenden das richtige Tool. Die Suche ist nicht erforderlich, sofern Sie keine Unterverzeichnisse haben.


Hinweis zu regulären Ausdrücken in sed und umbenennen.

Das Format ist sXsearch_patternXreplace_patternXoptions( Xkann ein beliebiges Zeichen sein). Suchmuster ist das, was Sie ersetzen möchten, also das, was bereits vorhanden ist, nicht das, wodurch Sie es ersetzen.

-wist ein einzelnes Wort und kann nur im Suchmuster vorkommen.

Antwort3

finden. -name "*039*" | umbenennen 's/039/036_2/g'

Antwort4

Alle Dateien mit dem Präfix „HAUPT_...“ durchlaufen und dann mit der Shell umbenennen. Teilzeichenfolge ${f:15}gibt die Zeichenfolge aus dem 15. Zeichen des Dateinamens zurück, angehängt an das HAUPT_...Präfix.

for f in "HAUPT_SIA_039*" ; do  mv $f "HAUPT_SIA_036_2${f:15}"; done

BEARBEITEN - Es scheint, dass das Verzeichnis mit allen Dateien auch Unterverzeichnisse mit demselben HAUPT...-Präfix enthält. Verwenden Sie in diesem Fall den findBefehl, um zunächst nur die Dateien und nicht die Verzeichnisse zu filtern.

find . -type f -name "HAUPT_SIA_039*" | while read f; do mv $f "HAUPT_SIA_036_2${f:15}"; done

verwandte Informationen