重複の可能性:
ファイル拡張子をクリーンアップするにはどうすればよいですか?
拡張子が.flac.mp3のファイルの名前を.mp3拡張子に変更したいと思います。次のコマンドを使用しました。
$ for i in *; do mv $i `echo $i | sed 's/.flac//g'`; done
これにより、各ファイルに対して次のエラーメッセージが記録されます。
mv: target `file.mp3' is not a directory
私は何が間違っていましたか?
ありがとう
ベストアンサー1
たぶん、このファイルの名前にスペースが含まれている可能性があります。
シェルプログラミングのための簡単な規則:変数とコマンドの置換には常に二重引用符を使用してください。(除外すべき理由を知っている場合を除く)だから:
for i in *; do mv "$i" "$(echo "$i" | sed 's/.flac//g')"; done
これにより、問題の原因でなくても、そのコマンドをよりよく実行できます。現在のディレクトリ内のすべてのファイルではなく、影響を受けるファイルに対してのみコマンドを実行する必要があります。 sed正規表現は.flac
拡張以外の項目とも一致できます。ファイル名がまたは-
で始まりバックスラッシュが含まれていても、コマンドはecho
失敗する可能性があります(一部のバージョンではそうではありません)。
for i in *.flac.mp3; do mv -- "$i" "$(echo "$i" | sed 's/\.flac\.mp3$/\.mp3/')"; done
しかし、実際にはここではsedを使用する必要はありません。文字列からサフィックスを削除するシェル構造があります。
for i in *.flac.mp3; do mv -- "$i" "${i%.flac.mp3}.mp3"; done
--
$i
aで始まっても-
オプションとして解釈されないようにしてください。もう一つのアプローチは、で$i
始まらないようにすることです-
。たとえば、すべての相対ファイル名の前に付いていることを確認してください(現在のディレクトリなので、指定された./
ファイルには影響しません)。.
./*.flac.mp3 の場合、mv "$i" "${i%.flac.mp3}.mp3" を実行します。
ファイル名を自動的に変更できるツールがたくさんあります。名前を変更するここにいくつかのアイデアがあります。たとえば、シェルがzshの場合:
autoload zmv # goes into your .zshrc
zmv '(*).flac.mp3' '$1.mp3'