여러 파일의 이름을 오름차순으로 바꾸기

여러 파일의 이름을 오름차순으로 바꾸기

다음 파일이 있습니다

SSt12.precip.374.sub.climatology.ctl
SSt12.precip.2874.sub.climatology.ctl
SSt12.precip.3764.sub.climatology.ctl
SSt12.precip.6774.sub.climatology.ctl

파일 이름을 다음으로 바꾸고 싶습니다.

SSt12.precip.1.sub.climatology.ctl
SSt12.precip.2.sub.climatology.ctl
SSt12.precip.3.sub.climatology.ctl
SSt12.precip.4.sub.climatology.ctl

답변1

그리고 zsh:

$ autoload zmv
$ n=0; zmv -n '(*.)<->(*.ctl)(#qn)' '$1$[++n]$2'
mv -- SSt12.precip.374.sub.climatology.ctl SSt12.precip.1.sub.climatology.ctl
mv -- SSt12.precip.2874.sub.climatology.ctl SSt12.precip.2.sub.climatology.ctl
mv -- SSt12.precip.3764.sub.climatology.ctl SSt12.precip.3.sub.climatology.ctl
mv -- SSt12.precip.6774.sub.climatology.ctl SSt12.precip.4.sub.climatology.ctl

( -n실제로 이름 바꾸기를 수행하지 않고 이 작업을 다시 수행합니다.)

GNU 도구를 사용하고 파일 이름에 개행 문자가 포함되어 있지 않다고 가정하면 다음과 같이 할 수 있습니다.

ls -v | awk -F. -vOFS=. -vORS='\0' '/\.ctl$/{print;$3=++n;print}' |
  xargs -r0n2 echo mv --

( echo실제로 이름을 바꾸려면 제거하세요)

답변2

printf 'cp SSt12.precip.374.sub.climatology.ctl \
   SSt12.precip.%d.sub.climatology.ctl\n' $(seq 5) | 
. /dev/stdin

분명히 당신 말은이름을 바꿔라- 이런 오해를 해서 죄송합니다.

하지만 만약 그렇다면... 374 - 378이라고 말해보세요...

printf 'n=%d ; mv SSt12.precip.$((373+n)).sub.climatology.ctl \
   SSt12.precip.${n}.sub.climatology.ctl\n' $(seq 5) | 
. /dev/stdin

위의 의견과 관련하여 동일한 디렉토리에 있고 일치하는 유일한 파일이라고 가정합니다 SSt12.precip.*.sub.climatology.ctl.

set -- SSt12.precip.*[67]4.sub.climatology.ctl
printf 'echo mv %s SSt12.precip.$((n=n+1)).sub.climatology.ctl\n' "$@" | 
    . /dev/stdin

echo제 계정에 후회 없으시도록 위의 방법으로 약화시켰습니다 . 현재 형태에서는 수행하려는 작업만 표시됩니다. 일단 삭제되면 echo해당 파일은 귀하의 것이며 이동되거나 손실될 수 있습니다.

올바른 정렬 순서에 대한 지침은 아래 Stephane의 설명을 참조하세요. 그의 말이 맞습니다.

답변3

실제로 동일한 파일이 아닌 여러 개의 파일이 있다고 가정하여 각 파일의 이름을 바꾸려면 다음을 수행할 수 있습니다.

for i in *ctl; do echo "$i"; done | 
    sort -t'.' -nk3 | 
        awk -F'.' -v OFS='.' '{printf "mv %s ", $0; $3=NR;print}' |
            sh

위의 내용은 파일 이름이 질문에 표시된 것과 정확히 일치한다고 가정합니다. 모두 점 3개로 구분된 필드로 숫자가 있으며 모두 ctl.

답변4

첫 번째 장애물은 파일을 올바른 순서로 가져오는 것입니다. 와일드카드 패턴은 SSt12.precip.*.sub.climatology.ctl숫자 순서가 아닌 사전 순서로 파일 이름을 확장하므로 파일을 2874, 374, 3764, 6774 순서로 배치합니다.

zsh에서는 다음 덕분에 쉽게 해결됩니다.n 글로벌 예선( SSt12.precip.*.sub.climatology.ctl(n)). 다른 셸에서는 더 많은 작업이 필요합니다. 숫자를 추출하고 정렬할 수 있습니다. 파일 이름에 개행 문자가 포함되지 않는 한 다음 방법이 있습니다. 처음 두 개의 점으로 구분된 부분을 제거한 다음 첫 번째 점으로 구분된 부분을 제외한 모든 부분을 제거하여 숫자를 추출했습니다.

number=1
for x in SSt12.precip.*.sub.climatology.ctl; do
  number="${x#*.*.}"; number="${number%%.*}"
  printf "%d %s\n" "$number" "$x"
done | sort -k1,1n |
while IFS= read -r filename; do
  filename=${filename#* }
  suffix=${filename#*.*.*.}
  prefix=${filename%.*."$suffix"}
  mv -- "$filename" "$prefix.$number.$suffix"
  number=$((number+1))
done

관련 정보