ersetzen Wenn ich xargs
manchmal verwende ich brauche nicht explizit den Ersatz-String verwenden:Ändern Zeichenfolge in xargs
find . -name "*.txt" | xargs rm -rf
In anderen Fällen mag ich den Ersatz-String angeben, um Dinge zu tun:
find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
der vorherige Befehl würde alle Textdateien im aktuellen Verzeichnis in /foo
bewegen und es wird die Erweiterung bar
auf alle Dateien anhängen.
Wenn ich anstelle des Hinzufügens von Text zu der Ersetzungszeichenfolge diese Zeichenfolge so ändern möchte, dass ich Text zwischen den Namen und die Erweiterung der Dateien einfügen kann, wie kann ich das tun? Nehmen wir zum Beispiel an, ich möchte dasselbe wie im vorherigen Beispiel tun, aber die Dateien sollten von <name>.txt
zu /foo/<name>.bar.txt
(anstelle von /foo/<name>.txt.bar
) umbenannt/verschoben werden.
UPDATE: Ich schaffe es, eine Lösung zu finden:
find . -name "*.txt" | xargs -I{} \
sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
mv "$1" "foo/${name}.bar.${ext}"' -- {}
Aber ich frage mich, ob es eine kürzere/bessere Lösung ist.
Nein, außer, dass ich mehr verwenden würde zitieren 'mv "$ 1" "foo/$ {name} .bar $ {ext}"' und Sie tun können, '. Basisname wie folgt: 'base = $ {1 ## * /}'. Sie sollten Ihre Lösung als Antwort veröffentlichen und akzeptieren. –
@DennisWilliamson Danke für Ihren Kommentar! Ich werde noch etwas warten, nur um zu sehen, ob irgendjemand etwas ausgefallenes macht, sonst werde ich die Frage selbst beantworten. – betabandido
Ich denke, wenn Ihr Dateiname das letzte Ding in der Zeile ist, brauchen Sie nicht die -I {} noch {} in der Befehlszeile. (Beachten Sie, dass der Hauptzweck von xargs darin besteht, Gruppen zu gruppieren. Wenn Sie also am Ende des Argumentaufrufs von xargs NICHT mehrere Dinge wollen, brauchen Sie "-l 1" (oder -L1 für einige Versionen von xargs). -I {} impliziert -l 1, deshalb funktioniert das auch hier.) –