
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, rename
zum 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
-n
s/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 find
mö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 d
es sei denn, Sie möchten nur Verzeichnisse umbenennen. Um Erweiterungen zu ändern, .jpg
versuchen .jpeg
Sie
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`}, ".")'