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
(顺便说一句,只需生成此列表就可以告诉您当前的问题出在哪里......)