複数のファイルの拡張子を変更するには?

複数のファイルの拡張子を変更するには?

ファイル拡張子をからに変更したいと*.txt思います*.textbasenameコマンドを実行しましたが、複数のファイルの変更に問題があります。

これは私のコードです。

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.txtfo.text.txt

ピリオドを一致させるには、を使用する必要があります\..すべての文字と一致します)。末尾は$行の終わりと一致します。これでのみ、拡張子が正しく一致する可能性があります。

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old

関連情報