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 mvfü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 findunterstützt wird, kann dies auf reduziert werden
find . -type f -name 'file*' -exec mv {} {}_renamed \;
Die xargsVersion ist nützlich, wenn Sie nicht verwenden {}, wie in
find .... -print0 | xargs --null rm
Hier rmwird einmalig (oder mit vielen Dateien mehrmals) aufgerufen, aber nicht für jede Datei.
Ich habe die basenamein dir stehende Frage entfernt, weil es wahrscheinlich falsch ist: Du würdest foo/bar/file8zu file8_renamed, nicht foo/bar/file8_renamed.
Bearbeitungen (wie in den Kommentaren vorgeschlagen):
findOhne gekürzt hinzugefügtxargs
- Sicherheitsaufkleber hinzugefügt
xist das nutzlos:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsVersion haben die gleiche Effizienz wie das erste Beispiel /