ファイル拡張子をからに変更したいと*.txt
思います*.text
。basename
コマンドを実行しましたが、複数のファイルの変更に問題があります。
これは私のコードです。
files=`ls -1 *.txt`
for x in $files
do
mv $x "`basename $files .txt`.text"
done
次のエラーが発生します。
basename:引数が多すぎます。詳細については、basename --help 'を試してください。
答え1
直接グレッグのウィキ:
# Rename all *.txt to *.text
for file in *.txt; do
mv -- "$file" "${file%.txt}.text"
done
*.txt
はいワイルドカードパターン、*
任意の文字列と一致させるためにワイルドカードとして使用されます。*.txt
「.txt」で終わるすべてのファイル名と一致します。
--
オプションリストの終わりを表示。これにより、ハイフンで始まるファイル名に関する問題を回避できます。
${file%.txt}
はいパラメータ拡張、最後に削除された変数の値に置き換えられますfile
。.txt
理由に関するトピックも参照してください。解析しないでくださいls
。
を使用する必要がある場合、basename
構文は次のとおりです。
for file in *.txt; do
mv -- "$file" "$(basename -- "$file" .txt).text"
done
答え2
現在のディレクトリにあるすべてのファイルの拡張子を変更する方法は次のとおりです。Debian または Ubuntu。
rename "s/oldExtension$/newExtension/" *.txt
(これはPerlrename
コマンドであり、そのutil-linux
コマンドではありません。Debian / Ubuntuの名前変更ユーティリティがCentOSなどの他のディストリビューションの名前変更ユーティリティと異なるのはなぜですか?)
MacOSでは、ユーザー修道士の足報告書は、彼らがbrew install rename
この目標を達成するためにそれを利用することができたと言います。
答え3
簡単なコマンド、rename
~からutil-linux
、あなたのためにこれを行います。 「*.txt」に一致するすべてのファイルで、「txt」を「text」に置き換えます。
rename txt text *.txt
答え4
ここで引用された答えはs/oldExtension/newExtension/
間違っています。を使用すると、必要に応じてs/txt/text/
変換されfootxt.txt
ません。footext.txt
を使用してもにs/.txt/.text/
変換されます。footxt.txt
fo.text.txt
ピリオドを一致させるには、を使用する必要があります\.
(.
すべての文字と一致します)。末尾は$
行の終わりと一致します。これでのみ、拡張子が正しく一致する可能性があります。
rename 's/\.txt$/.text/' *.txt
rename 's/\.old$/.new/' *.old