根据终端中 .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 不会在空格上分割行。

相关内容