8

あるディレクトリから別のディレクトリにファイルをコピーする単純なlaunchdaemonを開発しています。正常に転送するファイルを取得しました。

ディレクトリ内のファイルを.datではなく.mp3にしたいだけです

一部のファイルは次のようになります。

6546785.8786.dat
3678685.9834.dat
4658679.4375.dat

私はそれらをこのように見せたい:

6546785.8786.mp3
3678685.9834.mp3
4658679.4375.mp3

これは、ファイル拡張子の名前を変更するためにbashスクリプトの最後にあるものです。

cd $mp3_dir
mv *.dat *.mp3
exit 0

問題は、ファイルが6546785.8786.mp3ではなく*.mp3として出力されることです。

また、別の6546785.8786.datファイルが$ mp3_dirにインポートされると、*。mp3は新しい.mp3で上書きされます。

.datファイル拡張子だけを.mp3に名前変更し、ファイル名を保持する必要があります。

アイデア?提案?

4

2 に答える 2

27

試す:

for file in *.dat; do mv "$file" "${file%dat}mp3"; done

または、シェルにある場合:

rename .dat .mp3 *.dat

さて、コマンドが機能しなかった理由: まず第一に、名前が に変更されたときにディレクトリにファイルが 1 つしかなかったことは*.mp3確かmvです*.mp3: not a directory

そして、mv はファイル グロブに対して何の魔法もかけません。グロブを展開するのはシェルです。つまり、このファイルがディレクトリにある場合:

t.dat

そしてあなたは次のように入力しました:

mv *.dat *.mp3

シェルは に展開さ*.datt.datます。ただし、一致するものは何もない*.mp3ため、シェルはそれをそのまま残します。つまり、完全に展開されたコマンドは次のようになります。

mv t.dat *.mp3

文字通り、という名前のファイルが作成されます*.mp3

一方、次のようにという名前のファイルが複数*.datある場合:

t1.dat t2.dat

コマンドは次のように展開されます。

mv t1.dat t2.dat *.mp3

しかし、これは失敗します: に 3 つ以上の引数がある場合mv、最後の引数 (つまり*.mp3) がディレクトリであると想定します。

于 2011-12-18T13:28:02.003 に答える