분할파일[az]의 이름을 분할파일[1-26]로 바꾸는 방법

분할파일[az]의 이름을 분할파일[1-26]로 바꾸는 방법

splitfile[a-z]양식에 이름이 지정된 파일의 이름을 다음과 같이 바꾸려고 합니다 . 즉, 이름 을 splitfile[1-26].csv바꾸고 싶습니다 . 다음 명령을 시도했습니다. splitfileasplitfile1.csv

mv splitfile[a-z] splitfile[1-26].csv 

하지만 작동하지 않습니다. 도와주세요. for 루프를 사용하려고 합니다.

답변1

신규의 경우 bash다음 형식의 중괄호 확장을 사용할 수 있습니다 {a..z}.

i=1; for f in file{a..z}; do mv "$f.csv" "${f%?}$((i++)).csv"; done

답변2

perl이 유틸리티 rename(라고도 함 ) 가 있는 경우 prename이를 사용하여 파일 이름을 바꿀 수 있습니다.

rename -n 's/([a-z])$/ord($1)-96/e and $_ .= ".csv"' splitfile?

그것이 하는 일은 파일 이름과 일치하는 마지막 문자를 얻고 splitfile?, 문자를 해당 ASCII 서수로 변환하고(예: a=97, b=98, ...), 96을 빼고 일치하는 문자를 결과로 바꾸는 것입니다. 이 대체가 성공적으로 적용된 모든 파일 이름에 대해 ".csv" 문자열이 추가됩니다.

위의 명령은 실제 ​​파일을 변경하지 않고( -n이 플래그가 수행하는 작업) 단지 수행할 작업을 인쇄합니다. 한 번 실행하고 출력을 확인한 후 정확하다면 -n.

답변3

하나를 사용하면 zsh루프를 사용할 필요가 없고 함수만 사용할 수 있습니다 zmv.

autoload -U zmv
i=1 zmv -v '(file)[a-z].csv' '$1$((i++)).csv'

또는 모두 file[a-z].csv존재하지 않는 경우:

letters=({a..z})
zmv -v '(file)([a-z]).csv' '$1$letters[(i)$2].csv'

답변4

a-z모든 파일이 시퀀스 에 존재한다고 가정하고 POSIX 셸을 사용하여 이를 수행하는 한 가지 방법은 다음과 같습니다 .

#!/bin/sh
i=1
for f in file[a-z].csv
do
    echo mv $f file$i.csv
    i=$((i+1))
done

관련 정보