2011-01-09 4 views
5
내가 사용

A의 루프 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"으로 대체하고 해당 파일이 이미 있는지 확인해야합니다.

예 :의 내가 거기에 다음 파일과 디렉토리가 있다고 가정 해 봅시다 : 처음 16 개 문자 모든 파일에 대해 동일한 지

MyTerriblyLongLongFirstFile.jpg 
MyTerriblyLongLongSecondFile.jpg 
MyTerriblyLongLongThirdFile.jpg 
... 
MyTerriblyLongLongFourteenthFile.jpg 
... 
MyTerriblyLongLongOneHundredSixtySeventhFile.jpg 
... 
MyTerriblyLongLongFiveMillionthFile.jpg 

참고. 스크립트를 실행 한 후, 나는 그들이로 이름을 바꿀 수 싶습니다 :

MyTerriblyLongL1.jpg 
MyTerriblyLongL2.jpg 
MyTerriblyLongL3.jpg 
... 
MyTerriblyLong14.jpg 
... 
MyTerriblyLon167.jpg 
... 
MyTerribl5000000.jpg 

"MyTerriblyLongLongFourteenthFile.jpg는"알파벳 정렬에 따라 달라집니다 "MyTerriblyLong14.jpg"로 이름이 변경되는 경우 그것은 중요하지 않습니다. 각자 고유 한 이름을 얻는 것이 중요합니다.

가장 좋은 방법은 무엇입니까?

답변

4

먼저 테스트 파일을 사용해보십시오. mv 대신 echo을 사용하여 테스트하는 일반적인 방법은 잠재적 인 이름 충돌이 발생하지 않으므로 알려주지 않습니다.

#!/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 
+0

당신은 사람이야. 고마워요! – Martin

관련 문제