Das Folgende ist eine direkte Lösung Ihres Ansatzes:
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 mv
für jede Übereinstimmung eine neue Shell starten (die a ausführt ). Und wenn Sie lustige Zeichen in einem Dateinamen haben, wird dies explodieren. Ein effizienterer und sichererer Ansatz ist der folgende:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Es hat auch den Vorteil, mit seltsam benannten Dateien zu arbeiten. Wenn es find
unterstützt wird, kann dies auf reduziert werden
find . -type f -name 'file*' -exec mv {} {}_renamed \;
Die xargs
Version ist nützlich, wenn Sie nicht verwenden {}
, wie in
find .... -print0 | xargs --null rm
Hier rm
wird einmalig (oder mit vielen Dateien mehrmals) aufgerufen, aber nicht für jede Datei.
Ich habe die basename
in dir stehende Frage entfernt, weil es wahrscheinlich falsch ist: Du würdest foo/bar/file8
zu file8_renamed
, nicht foo/bar/file8_renamed
.
Bearbeitungen (wie in den Kommentaren vorgeschlagen):
find
Ohne gekürzt hinzugefügtxargs
- Sicherheitsaufkleber hinzugefügt
x
ist das nutzlos:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
Version haben die gleiche Effizienz wie das erste Beispiel /