端末の .txt ファイルのリストに従ってファイル名を変更します。

端末の .txt ファイルのリストに従ってファイル名を変更します。

複数のオーディオファイルの名前を変更しようとしています。名前は「1 Audio Track.aiff」などです。古いファイル名と新しいファイル名がタブで区切られた.txtファイルがあります。たとえば、.txt ファイルには次のように表示されます。 1 Audio Track.aiff Blues in Orbit.

ファイルがあるディレクトリでこのコードを実行します。

 for oldname newname in $(cat filenames.txt); do
 mv "$oldname" "$newname"
 done

.txt ファイルも同じディレクトリにあります。ただし、コードが実行されると、次のメッセージが表示されます。そのファイルやディレクトリはありません。ファイル名を1に変更し、古いファイル名1と新しいファイル名(Arturと仮定)を使用して.txtファイルを作成すると機能します。問題は.txtファイルの構文によって発生したようですが、スペースを使用することはできません。ターミナルは、Orbitの1 Audio Track Bluesをファイル1をオーディオに変更するなどと解釈します。一重引用符と二重引用符、括弧で囲んで使ってみました。スペースをシミュレートするためにバックスラッシュも追加しました。どんなアイデアがありますか?ご協力ありがとうございます。

答え1

たぶん、次のようにしてみてください。

while IFS=$'\t' read -r oldname newname 
do
 mv -- "$oldname" "$newname"
done < filenames.txt

これにより、IFSファイルから読み取る区切り文字()を設定し、bashがスペースから行を分割しないようにすることができます。

関連情報