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