bash:截断文件名,使它们保持唯一
发布时间:2020-12-15 17:00:54 所属栏目:安全 来源:网络整理
导读:我正在使用与此类似的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
我正在使用与此类似的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位并且到目前为止所有名称都已被取出,它应该用“10”替换“Shortname”的最后两个字符并检查该文件是否已经存在. 示例:假设我有一个包含以下文件的目录: 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”并不重要,这取决于字母排序.他们每个人都有一个独特的名字,这一点非常重要. 做这个的最好方式是什么?
首先在测试文件上试一试.通常使用echo而不是mv进行测试的方法不会告诉你太多,因为不会创建潜在的名称冲突.
#!/bin/bash num=1 length=16 for file in M*.jpg do newname=$file until [[ ! -f $newname ]] do (( sublen = length - ${#num} )) printf -v newname '%.*s%d' "$sublen" "$file" "$num" (( num++ )) done mv "$file" "$newname" done 测试: $touch MyTerriblyLongLongFilenames{a..k}.jpg $touch MyTerriblyLongL3 $ls M* MyTerriblyLongL3 MyTerriblyLongLongFilenamesf.jpg MyTerriblyLongLongFilenamesa.jpg MyTerriblyLongLongFilenamesg.jpg MyTerriblyLongLongFilenamesb.jpg MyTerriblyLongLongFilenamesh.jpg MyTerriblyLongLongFilenamesc.jpg MyTerriblyLongLongFilenamesi.jpg MyTerriblyLongLongFilenamesd.jpg MyTerriblyLongLongFilenamesj.jpg MyTerriblyLongLongFilenamese.jpg MyTerriblyLongLongFilenamesk.jpg $./nocollide $ls M* MyTerriblyLong10 MyTerriblyLongL1 MyTerriblyLongL4 MyTerriblyLongL7 MyTerriblyLong11 MyTerriblyLongL2 MyTerriblyLongL5 MyTerriblyLongL8 MyTerriblyLong12 MyTerriblyLongL3 MyTerriblyLongL6 MyTerriblyLongL9 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |