如何修复此命令批量重命名文件以匹配文本文件

如何修复此命令批量重命名文件以匹配文本文件
for file in *; do read line;  mv -v "${file}" "${line}";  done < /var/www/html/uploads/songs.txt

它的工作方式与更改所有 700 个文件相同。但它似乎没有按照正确的顺序进行。我觉得它正在改变顺序,因为它重命名了它们,或者我不能 100% 确定。

这是一个例子:第一个文件是:

/var/www/html/uploads/Music/A.D.I.D.A_S - Live (Korn Live).mp3_Rare_2006_.mp3

首先在文本文件中将其重命名为:

/var/www/html/uploads/Music/A_D_I_D_A_S__Live_Korn_Live__.mp3_Rare_2006_.mp3

就像我说的,它们都被重命名了,而且很多都匹配。通常是第一个和最后几个。然而,中间似乎没有保持适当的顺序,最终得到另一个文件名。

答案1

恕我直言,这是一种非常危险的技术,您会受到目录中任何更改(添加/删除文件)的影响。一种更安全的技术是列出成对的旧/新名称,并且:

  • 迭代现有文件,用于grep检索新名称
  • 将整个列表加载到关联数组中(在最新版本的 bash 中,数组可以使用字符串索引)
  • 放弃所有这些复杂性,只需在列表中的行开头添加“mv”,并将其用作脚本

您可以使用以下方法生成对列表:

ls pattern_for_old* | paste - list_of_new_names >combined.lst

(顺便说一句,只需生成此列表就可以告诉您当前的问题出在哪里......)

相关内容