고정 패딩 순서로 증가하는 숫자 패턴을 사용하여 사전식으로 파일 이름 바꾸기

고정 패딩 순서로 증가하는 숫자 패턴을 사용하여 사전식으로 파일 이름 바꾸기

이런 파일이 있어요

a
bb
ccc
abc
emrls

정렬한 후(예: 사전식) 각 파일의 이름이 다음과 같도록 이름을 바꾸고 싶습니다.

00001
00002
00003
etc

0으로 채워진 숫자의 수는 위의 경우 6과 같이 미리 지정됩니다(필요한 숫자 수를 알고 있다고 가정).

내가 가장 좋아하는 쉘은 이므로 (아마도 's ?를 사용하여) 기능을 활용하는 zsh솔루션에 관심이 있습니다. 또한 Bash 호환 솔루션에도 관심이 있습니다.zshzshzmv

답변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]$ 

관련 정보