bash: Обрезать имена файлов, сохраняя их уникальность

Я использую цикл 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 ведет себя таким образом).

Как я могу проверить, если файл с именем «Короткое имя» уже существует, и если это так, замените последний символ «Краткое имя» числом. Затем еще раз проверьте, существует ли файл с таким именем, и если да, попробуйте увеличить номер. И так далее .Если доходит до номера 9 и до сих пор все имена были заняты, он должен заменить последние ДВА символа "Краткого имени" с «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

Не имеет значения, переименован ли «MyTerriblyLongLongFourteenFile.jpg» в «MyTerriblyLong14.jpg», это зависит от сортировки по алфавиту. Просто важно, чтобы каждому из них было присвоено уникальное имя.

Как лучше всего это сделать?

5
задан Martin 9 January 2011 в 08:36
поделиться