回答:
Bashでこれを行う1つの方法を次に示します。
for i in *; do [ "${i/%MP3/mp3}" != "$i" ] && echo "$i" "${i/%MP3/mp3}"; done
私はecho
ここで使用したので、コマンド自体は何もしないでファイル名のペアを出力します。そのリストが希望する変更を表す場合は、ファイルを移動するecho
ようなものに変更できmv -i --
ます(上書きする前にプロンプトが表示されます)。
にfor
一致するすべてのファイルを反復処理します*
。次に、拡張子が既に小文字であるかどうかを判断し、そうである場合は先に進み、そうでない場合は、先に進みます(場合によってはエコーします)。これは、Bashの組み込みの文字列操作を使用します。これについては、http://tldp.org/LDP/abs/html/string-manipulation.htmlを参照してください。
zshの場合:
autoload zmv
zmv '(*).MP3' '$1.mp3' # rename files in the current directory only
zmv '(**/)(*).MP3' '$1$2.mp3' # rename files in subdirectories as well
.Mp3
または.mP3
ファイルを管理するには:
zmv '(**/)(*).(#i)mp3' '$1$2.mp3'
それらの場合は、renameコマンドを使用できます(APIが異なる2つの主要な実装があることに注意してください)。たとえば、ファイル名拡張子の大文字と小文字を大文字から小文字に変更するには、次のようにします。
以下とrename
からutil-linux
(とも呼ばれるrename.ul
)、と仮定すると.JPG
、一度だけファイル名に発生しました
rename -- .JPG .jpg *.JPG
以下とrename
からperl
(と呼ばれることもありprename
、いくつかの変異体が発表されています):
rename 's/\.JPG$/.jpg/' ./*.JPG
これは、彼が面倒なbashスクリプトからこの単純なコマンドに正確にユースケースを移行する方法についてのチュートリアルです。
これを行うためのもう1つの豪華なコマンドはpax
です。シェルにZSHを使用してzmv
いる場合は、も使用できます。
syntax error at (user-supplied code), near "."
このコマンドを実行すると、エラーが発生します。
正規表現を使用したファイル名変更のスイスアーミーナイフであるperl-renameを使用します(ubuntuでは、これはprelとしてperlパッケージにバンドルされています)。
# Replace prename as appropriate (i.e. if you've got it installed under a different name
find /RootPath -type f -iname '*.mp3' -print0 | xargs -0 prename 's/mp3$/mp3/i'
注意深くソートする場合は、-nおよび-vオプションを使用してperl renameを実行し、実際に何が行われるかを確認してください。
Linuxでの「拡張子」は実際にはファイル名文字列の一部に過ぎないため、スクリプトが必要です。新しい名前を取得するには、スクリプトで文字列を操作する必要があります。
#!/bin/bash
for NAME in *.JPG
do
PREFIX=${NAME%.*}
NEWNAME="$PREFIX.jpg"
mv "$NAME" "$NEWNAME"
done
空白を含むファイル名がある場合、二重引用符は重要です。二重引用符のいくつかは少し自明ではないと思いました。
まずファイルをバックアップしてください!あなたはpythonのワンライナーを使うことができます:
python -c "import glob,os; [os.rename(fn, fn.replace('.MP3', '.mp3')) for fn in glob.glob('PATH_TO_YOUR_DIRECTORY')]"
編集:
以下は、ワンライナーが実際にどのように機能するかについての詳細な説明です。を使用python -c
して、Pythonインタープリターにコマンドを渡します。ライブラリをインポートした後os
のためにrename
機能し、glob
ファイルリストのために、私たちは、私はと呼ばれる特定のディレクトリにファイルリストを反復処理する必要がありPATH_TO_YOUR_DIRECTORY
、たとえば、何か./*
現在のディレクトリにあるすべてのもののために。
ワンライナー構文では、残念ながら表記法のfor
後にループが機能しないimport
ため、ブラケット表記を使用する必要があります。つまりglob
、指定されたパスから文字列の形式で提供されているすべてのファイルまたはディレクトリ名について、*。MP3を* .mp3に置き換えます。
OPは再帰検索について言及していなかったので、そもそもそれを含めませんでした。