숫자가 아닌 접두사가 있는 경우 파일 이름을 숫자로 정렬합니다.

숫자가 아닌 접두사가 있는 경우 파일 이름을 숫자로 정렬합니다.

다음 형식의 파일이 있습니다.x1 x2 ... x10 x11 ... x101 ...

이 파일들의 이름을 모두 같은 이름 길이를 갖도록 바꾸고 싶습니다.x001 x002 ... x010 ...

숫자가 아닌 접두사가 없는 파일에 대해 이 작업을 수행할 수 있지만( sort -n후행 만 사용 while read x;) 파일 이름으로 시작하지 않으면 정렬에서 숫자 값을 인식하지 못합니다.

답변1

v예를 들어 (version) 옵션을 사용하여 파일을 정렬해 볼 수 있습니다 . 또는 숫자 정렬을 구분 기호로 사용할 수 있습니다. lsls -1vxls | sort -n -t 'x' +1

그러나 이름을 바꾸기 위해 파일을 정렬할 필요는 없습니다. 파일 이름의 길이를 보고 필요한 경우 0으로 채울 수 있습니다. 다음은 이 작업을 수행하는 작은 스크립트입니다.

prefix=x
maxLength=4

for file in ${prefix}*
do
 if [ ${#file} -lt $maxLength ]
 then
     newFile=$file
     while [ ${#newFile} -lt $maxLength ]
     do
       newFile=${newFile/$prefix/${prefix}0}
     done   
     mv $file $newFile
 fi
done

답변2

먼저 정렬해야 합니까?

m=0
for f in x*; do
  [ "${#f}" -gt "$m" ] &&
    m=${#f}
done

for f in x*; do
  echo mv -- "$f" "${f%${f#?}}$( printf '%0.*d' $(( m - 1 )) "${f#?}" )"
done 

printf 구현이 위 구문을 지원하지 않으면 printf "%0.$(( m - 1 ))d" "${f#?}".

만족스러우면 에코를 제거합니다.

답변3

도그베인에 대해 자세히 설명하자면답변, sort버전 정렬 옵션이 있습니다. 일부 플랫폼(예: busybox)에는 이 옵션이 없습니다.

다음과 같이 사용할 수 있습니다.

sort -V
sort --version-sort

또는 n번째 열에서 버전 정렬을 수행합니다.

sort -knV

답변4

이름을 바꿔야 하며 다음과 같은 도구가 도움이 됩니다.

touch x1 x2 x10 x11 x101 
ls ; rename 's/x/x0/' x[0-9] 

x1 x10 x101 x11 x2

ls ; rename 's/x/x0/' x[0-9][0-9] 

x01 x02 x10 x101 x11

ls

x001 x002 x010 x011 x101

'이름 바꾸기'는 적어도 Linux를 설치해야 하는 경우 일부 Perl 패키지의 일부입니다.

이름을 바꾸지 않고 루프를 사용하는 유사한 솔루션이 있습니다.

rm * 
touch x1 x2 x10 x11 x101
for f in  x[0-9] ; do mv $f ${f/x/x0}; done 
for f in  x[0-9][0-9] ; do mv $f ${f/x/x0}; done ; ls 

x001 x002 x010 x011 x101

관련 정보