使用文件列表重命名多个文件

时间:2015-08-28 00:01:01

标签: bash file file-rename

在bash中如何使用文本文件中的名称重命名多个文件,我有一个包含多个.mp3文件的目录:1.mp3. 2.mp3, 3.mp3, 4.mp3等... 和一个文本文件:names.txt: song1.mp3 song2.mp3 song3.mp3 等等。

文本文件中的第一行将对应于文件的第一行,第二行对应于第二行等。我已经在python中找到了几种方法,但是想学习如何在bash中实现这一点,提前谢谢!

1 个答案:

答案 0 :(得分:2)

如果目录中的文件具有名称(如1.mp3),但不包含标签或换行符,则以下内容将起作用:

printf "%s\n" *.mp3 | paste - file | while IFS=$'\t' read -r old new; do mv "$old" "$new"; done

这甚至可以在新文件名中包含空白,例如Joe's "favorite" song.mp3

如何运作

printf语句写入每个mp3文件名,每行一个:

$ printf "%s\n" *.mp3
1.mp3
2.mp3
3.mp3

paste命令将旧文件名和new文件名组合在一起,用标签分隔它们:

$ printf "%s\n" *.mp3 | paste - file2
1.mp3   song1.mp3
2.mp3   song2.mp3
3.mp3   song3.mp3

读取命令IFS=$'\t' read -r old new将旧文件名和新文件名读入shell变量oldnew

mv命令mv "$old" "$new"重命名文件。

多行版本

如果您希望代码分布在多行:

printf "%s\n" *.mp3 | paste - file | while IFS=$'\t' read -r old new
do
    mv "$old" "$new"
done