Ich wollte alle .sh-Erweiterungen löschen.
ls *.sh | xargs -I {} mv {} `basename {} .sh`
Es funktioniert jedoch nicht, sondern basename
gibt einen unveränderten Dateinamen zurück.
Warum verhält es sich so?
Das funktioniert zum Beispiel:
ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;
EDIT :
Lösung: Ein einfaches Anführungszeichen verhindert die `basename ...`
Auswertung durch die Shell, bevor der Befehl ausgeführt wird.
ls *.sh | xargs -I {} sh -c 'mv {} `basename {} .sh`'
bash
text-processing
xargs
Majkinetor
quelle
quelle
-i
Option eingestellt, aber diese "klassischen" Optionen sind veraltet. Um beispielsweise nur eine Option / Zeile zu verwenden, empfiehlt die neue POSIX-Manpage-L1
. Um das alte Verhalten von aufzurufen-i
, empfiehlt die Seite die-I'{}'
Option.rename
, zum Beispiel:rename 's/\.sh//' *.sh
. Versuchen Sie es zuerst mit Trockenlauf (-n
).rename
großartig und ziemlich einfach, aber denke daran, dass es sehr vertriebsspezifisch ist. RHEL- und Debian-basierte Distributionen bieten unterschiedlicherename
Befehle, daher muss man dies berücksichtigen, wenn man Cross-Distribution-Skripte erstellt.Ich bin mir nicht sicher, warum Ihre erste Zeile nicht funktioniert. Oder suchen Sie nach einer geeigneten Methode, um alle .sh-Dateien umzubenennen?
Angenommen, es ist die sauberste Methode, bevorzuge ich, Befehlsoptionen vorzubereiten
xargs
. Zum Entfernen einer .sh-Dateierweiterung halte ich oft diesen Ansatz,quelle