複数のオーディオファイルの名前を変更しようとしています。名前は「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がスペースから行を分割しないようにすることができます。