Bash benennt 360.000 Dateien mit find -exec um

Bash benennt 360.000 Dateien mit find -exec um

Ich habe ungefähr 360.000 Dateien wie:

./001/1/1.jpg
./001/1/2.jpg
./001/2/1.jpg
./002/1/1.jpg
./003/1/1.jpg
...
pattern: [60 dirs]/[1000 subdirs]/[4-10 files].jpg

Ich möchte Dateien umbenennen, renamezum Beispiel von *.jpg in *.jpeg. Ich kann das nicht mit einem einzigen tun rename, da ich die Fehlermeldung „Argumentliste ist zu lang“ erhalte.

Auf der Suche nach einer Lösung bin ich auf Folgendes gestoßen, aber es benennt nichts um:

find -maxdepth 2 -mindepth 2 -type d -exec rename -n 's/jpg/jpeg/' {}/* \;

Wenn ich überprüfe, ob es {}erweitert ist, ersetze ich „rename“ durch „echo“:

find -maxdepth 2 -mindepth 2 -type d -exec echo "rename -n 's/jpg/jpeg/' {}/*" \;

Ich erhalte das erwartete Ergebnis:

rename -n 's/jpg/jpeg/' ./061/61430/*
rename -n 's/jpg/jpeg/' ./061/61431/*
...

Wenn ich einen dieser Umbenennungsbefehle ausführe, funktioniert die Umbenennung. Es sollte also ein Problem mit dem geben {}.

Danke für die Hilfe!

Antwort1

Im ersten Fall *wird von der Shell erweitert, bevor sie zu gelangt rename(falls es überhaupt erweitert wird – ich bezweifle, dass irgendetwas mit übereinstimmt ), und wenn es nicht erweitert wird, wird der Befehl mit den drei Argumenten , und {}/*ausgeführt . Das letzte Argument ist nicht der Name einer vorhandenen Datei und bewirkt daher nichts.rename-ns/jpg/jpeg/some/path/*rename

Ohne Shell-Globbing ist der Pfad nutzlos rename.

Tun Sie stattdessen Folgendes:

find -maxdepth 3 -mindepth 3 -type f -iname '*.jpg' -exec rename -n 's/jpg$/jpeg/i' {} +

Verwenden Sie die Möglichkeit von , mit anstelle von findmöglichst lange Befehlszeilen zu erstellen .+;

Antwort2

find  | prename 's/\.jpg$/.jpeg/'

oder wenn Sie andere Dateien im aktuellen Verzeichnis haben

find 0[0-9][0-9] | prename 's/\.jpg$/.jpeg/'

Antwort3

Sie sollten nicht angeben, type des sei denn, Sie möchten nur Verzeichnisse umbenennen. Um Erweiterungen zu ändern, .jpgversuchen .jpegSie

find . -maxdepth 2 -mindepth 2 -name '*.jpg' -exec sh -c 'echo mv -- "$0" "${0%%.jpg}.jpeg"' {} \;

Entfernen Sie es echo, wenn Ihnen gefällt, was auf dem Bildschirm angezeigt wird.

Antwort4

Bei Verwendung von Cygwin verfügt meine Version von rename nicht über den Regex-Ersatz, und auch die rename [options] expression replacement file...Syntax scheint nicht zu funktionieren. Außerdem schlagen die Bash-Vorschläge fehl mit

... -c: line 0: unexpected EOF while looking for matching `"'
... -c: line 1: syntax error: unexpected end of file

Ach, leider gibt es immer noch Perl:

perl -MFile::Find -e 'find(sub{return unless /^(.*)\.jpg$/;`mv $_ $1.jpeg`}, ".")'

verwandte Informationen