【问题标题】:bash: Truncate Filenames, keeping them uniquebash:截断文件名,保持它们的唯一性
【发布时间】:2011-06-06 00:26:28
【问题描述】:

我正在使用与此类似的 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”无关紧要,这取决于字母排序。他们每个人都有一个唯一的名字,这一点很重要。

最好的方法是什么?

【问题讨论】:

    标签: bash filenames truncate renaming


    【解决方案1】:

    先在测试文件上试试这个。使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多