我正在使用与此类似的 for 循环将文件夹中的所有文件名截断为 16 个字符:
for i in *; do
Shortname=${i:0:16} # Let's assume I don't need the extension
mv "$i" "$Shortname"
done
问题是:只要两个文件名的前 16 个字符相同,后一个文件名就会覆盖前一个文件名(在 OS X mv 上就是这样)。
如何检查名称为“Shortname”的文件是否已经存在,如果存在,请将“Shortname”的最后一个字符替换为数字。然后再次检查是否存在具有该名称的文件,如果存在,请尝试更大的数字。等等。如果它到达数字 9 并且到目前为止所有名称都已被使用,它应该将“Shortname”的最后两个字符替换为“10”并检查该文件是否已经存在。
示例:假设我有一个目录,其中包含以下文件:
MyTerriblyLongLongFirstFile.jpg
MyTerriblyLongLongSecondFile.jpg
MyTerriblyLongLongThirdFile.jpg
...
MyTerriblyLongLongFourteenthFile.jpg
...
MyTerriblyLongLongOneHundredSixtySeventhFile.jpg
...
MyTerriblyLongLongFiveMillionthFile.jpg
请注意,所有文件的前 16 个字母都是相同的。运行脚本后,我希望将它们重命名为:
MyTerriblyLongL1.jpg
MyTerriblyLongL2.jpg
MyTerriblyLongL3.jpg
...
MyTerriblyLong14.jpg
...
MyTerriblyLon167.jpg
...
MyTerribl5000000.jpg
是否将“MyTerriblyLongLongFourteenthFile.jpg”重命名为“MyTerriblyLong14.jpg”并不重要,这取决于字母排序。他们每个人都有一个唯一的名字,这一点很重要。
做这个的最好方式是什么?