이런 파일이 있어요
a
bb
ccc
abc
emrls
정렬한 후(예: 사전식) 각 파일의 이름이 다음과 같도록 이름을 바꾸고 싶습니다.
00001
00002
00003
etc
0으로 채워진 숫자의 수는 위의 경우 6과 같이 미리 지정됩니다(필요한 숫자 수를 알고 있다고 가정).
내가 가장 좋아하는 쉘은 이므로 (아마도 's ?를 사용하여) 기능을 활용하는 zsh
솔루션에 관심이 있습니다. 또한 Bash 호환 솔루션에도 관심이 있습니다.zsh
zsh
zmv
답변1
당신은 그것을 사용할 수 있습니다l
매개변수 확장 플래그왼쪽에 숫자를 입력하세요.
i=0; for x in *; do ((++i)); mv -- $x new/${(l:6::0:)i}; done
POSIX 기능만 사용하여 이 작업을 수행하는 비교적 간단한 방법이 있습니다. 1 대신 1000001(6자리 숫자)에서 번호 매기기를 시작하고 선행 1
.
i=1000000; for x in *; do i=$((i+1)); mv -- "$x" new/${i#1}; done
이점을 활용하려면 대체 텍스트 내에서 zmv
증가하는 산술 표현식을 사용할 수 있습니다.i
i=0; zmv '*' '${(l:6::0:)$((++i))}'
i=1000000; zmv '*' '${$((++i))#1}'
다음에 추가o
글로벌 예선파일을 다른 순서로 정렬해야 하는 경우. 패턴에 glob 한정자가 포함된 경우 zmv
플래그를 전달해야 합니다.-Q
답변2
이 bash 스니펫을 사용하세요.
[centos@centos new]$ touch a bb ccc dddd eee f gh i
[centos@centos new]$ touch abc emrls cdg sf
[centos@centos new]$ touch ABC A BB CCC DD GI KLM kmna kabc mas nas san fin zoo
[centos@centos new]$ \ls -1
a
A
abc
ABC
bb
BB
ccc
CCC
cdg
DD
dddd
eee
emrls
f
fin
gh
GI
i
kabc
KLM
kmna
mas
nas
san
sf
zoo
[centos@centos new]$ a=0; for i in *; do a=$(($a+1)); b=`printf "%06d" $a`; mv -v ${i} ${b}; done
`a' -> `000001'
`A' -> `000002'
`abc' -> `000003'
`ABC' -> `000004'
`bb' -> `000005'
`BB' -> `000006'
`ccc' -> `000007'
`CCC' -> `000008'
`cdg' -> `000009'
`DD' -> `000010'
`dddd' -> `000011'
`eee' -> `000012'
`emrls' -> `000013'
`f' -> `000014'
`fin' -> `000015'
`gh' -> `000016'
`GI' -> `000017'
`i' -> `000018'
`kabc' -> `000019'
`KLM' -> `000020'
`kmna' -> `000021'
`mas' -> `000022'
`nas' -> `000023'
`san' -> `000024'
`sf' -> `000025'
`zoo' -> `000026'
[centos@centos new]$