다음 형식의 파일이 있습니다.x1 x2 ... x10 x11 ... x101 ...
이 파일들의 이름을 모두 같은 이름 길이를 갖도록 바꾸고 싶습니다.x001 x002 ... x010 ...
숫자가 아닌 접두사가 없는 파일에 대해 이 작업을 수행할 수 있지만( sort -n
후행 만 사용 while read x;
) 파일 이름으로 시작하지 않으면 정렬에서 숫자 값을 인식하지 못합니다.
답변1
v
예를 들어 (version) 옵션을 사용하여 파일을 정렬해 볼 수 있습니다 . 또는 숫자 정렬을 구분 기호로 사용할 수 있습니다. ls
ls -1v
x
ls | 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