Ich möchte eine Dateierweiterung von *.txt
ändern zu *.text
. Ich habe versucht, den basename
zu verwenden Befehl, aber ich habe Probleme beim Ändern von mehr als einer Datei.
Hier ist mein Code:
files=`ls -1 *.txt`
for x in $files
do
mv $x "`basename $files .txt`.text"
done
Ich erhalte diesen Fehler:
basename: too many arguments Try basename --help' for more information
Akzeptierte Antwort:
Direkt aus Gregs Wiki:
# Rename all *.txt to *.text
for f in *.txt; do
mv -- "$f" "${f%.txt}.text"
done
*.txt
ist ein Globbing-Muster, das *
verwendet als Platzhalter für eine beliebige Zeichenfolge. *.txt
stimmt mit allen Dateinamen überein, die mit „.txt“ enden.
--
markiert das Ende der Optionsliste. Dadurch werden Probleme mit Dateinamen vermieden, die mit Bindestrichen beginnen.
${f%.txt}
ist eine Parametererweiterung, ersetzt durch den Wert von f
Variable mit .txt
am Ende entfernt.
Siehe auch den Eintrag, warum Sie ls
nicht parsen sollten .
Wenn Sie basename
verwenden müssen , Ihre Syntax wäre:
for f in *.txt; do
mv -- "$f" "$(basename -- "$f" .txt).text"
done