Ich möchte mehrere Dateien (Datei1 … DateiN in Datei1_umbenannt … DateiN_umbenannt) mit find
umbenennen Befehl:
find . -type f -name 'file*' -exec mv filename='{}' $(basename $filename)_renamed ';'
Aber ich bekomme diesen Fehler:
mv: cannot stat ‘filename=./file1’: No such file or directory
Dies funktioniert nicht, da Dateiname nicht als Shell-Variable interpretiert wird.
Akzeptierte Antwort:
Das Folgende ist eine direkte Lösung für Ihren Ansatz:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
Dies ist jedoch sehr teuer, wenn Sie viele übereinstimmende Dateien haben, da Sie eine neue Shell starten (die eine mv
) für jedes Spiel. Und wenn Sie lustige Zeichen in einem Dateinamen haben, wird dieser explodieren. Ein effizienterer und sichererer Ansatz ist dieser:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Es hat auch den Vorteil, mit seltsam benannten Dateien zu arbeiten. Wenn find
unterstützt, kann dies auf
find . -type f -name 'file*' -exec mv {} {}_renamed \;
Die xargs
Version ist nützlich, wenn {}
nicht verwendet wird , wie in
find .... -print0 | xargs --null rm
Hier rm
wird einmal (oder bei vielen Dateien mehrmals) aufgerufen, aber nicht für jede Datei.
Ich habe den basename
entfernt in Ihrer Frage, weil es wahrscheinlich falsch ist:Sie würden foo/bar/file8
verschieben zu file8_renamed
, nicht foo/bar/file8_renamed
.
Änderungen (wie in den Kommentaren vorgeschlagen):
- Kurzer
find
hinzugefügt ohnexargs
- Sicherheitsaufkleber hinzugefügt