ファイル拡張子をクリーンアップする方法は?


9

拡張子を.mp3に変更したい.MP3ファイルを含むディレクトリがあります。これを行う最も簡単な方法は何ですか?私は次のように考えています:

find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \; 

...私はそれが正しくないことを知っていますが。:)置換は正しくなくmv、a sed-execinでコマンドの両方を使用する方法がわかりませんfind

これにはbashスクリプトが必要ですか?

回答:


12

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を参照してください。


あなたの答えをありがとう、そしてbash文字列操作に関するリンクを私に示してください!

7

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'

6

それらの場合は、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いる場合は、も使用できます。


素晴らしい!まさに私が必要としていたもの
JoshP 2013年

syntax error at (user-supplied code), near "."このコマンドを実行すると、エラーが発生します。
ライアンゲイツ

3

正規表現を使用したファイル名変更のスイスアーミーナイフである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を実行し、実際に何が行われるかを確認してください。


ご回答有難うございます。サーバーにperlrenameはありませんが、今日は後でそれをいじります。

0

Linuxでの「拡張子」は実際にはファイル名文字列の一部に過ぎないため、スクリプトが必要です。新しい名前を取得するには、スクリプトで文字列を操作する必要があります。

#!/bin/bash
for NAME in *.JPG
do
    PREFIX=${NAME%.*}
    NEWNAME="$PREFIX.jpg"
    mv "$NAME" "$NEWNAME"
done

空白を含むファイル名がある場合、二重引用符は重要です。二重引用符のいくつかは少し自明ではないと思いました。


1
あなたのスクリプトに言うごとに何も悪いことはありませんが、あなたは非常に反抗的にこのためのスクリプトを必要としません。ほとんどのシェルでは、1行でこれを実行する方法はおそらく12通りあり、それを簡単にするためのユーティリティもたくさんあります。
カレブ

0

バッシュで:

# renaming files in the current directory only
for f in *.MP3; do mv "$f" "${f%.MP3}.mp3"; done  

# renaming files in subdirectories as well
for f in *{,/*}.mp3; do mv "$f" "${f%.MP3}.mp3"; done

0

まずファイルをバックアップしてください!あなたは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は再帰検索について言及していなかったので、そもそもそれを含めませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.