파일이 여러 개 있는데 정규식을 사용하여 이름을 바꾸고 싶습니다. Linux 명령줄에서 이 작업을 수행하고 싶습니다.
파일이 있습니다
report1.txt
report2.txt
report3.txt
선언하도록 이름을 어떻게 바꿀 수 있습니까?
myreport1.txt
myreport2.txt
myreport3.txt
인터넷에서 검색했는데 복잡한 예가 많이 있습니다.
답변1
한 줄에 간단한 루프를 사용할 수 있습니다.
for ftr in report[0-9]*.txt; do mv "$ftr" "my${ftr}"; done
루프를 사용하지 않으려면 다음을 시도해 보세요.
find . -maxdepth 1 -type f -name "report[0-9]*.txt" -printf "%f\n" | xargs -I{} mv {} my{}
for 루프와 마찬가지로 파일과 동일한 경로에 배치해야 합니다.
답변2
댓글에서 OP의 질문에 대답하려면: "for 루프를 사용하지 않고 이 작업을 수행할 수 있는 방법이 있습니까?"
나는 보통 이를 위해 전용 유틸리티를 사용합니다.mmv
mmv 'report?.txt' 'myreport#1.txt'
(예를 들어 다른 유사한 도구가 여러 개 있습니다 rename
)
답변3
zsh
셸 에서 다음 명령은 표시된 세 파일의 이름을 바꿉니다.
autoload -U zmv
zmv -v -- 'report<1-3>.txt' 'my$f'
소스 패턴은 유효한 zsh
확장 와일드카드 패턴(따옴표 포함)이어야 하며 여기에 사용된 소스 패턴은 언급한 세 가지 파일 이름과만 일치합니다.
대상 모드에서는 $f
전체 원본 파일 이름으로 대체됩니다. 등을 사용하여 소스 패턴에서 괄호로 묶인 캡처 그룹을 참조할 수도 있습니다 $1
( 여기서는 필요하지 않기 때문에 사용하지 않음).$2
bash
셸 에서 (소스 및 대상 모드를 zsh -c
셸에 인수로 전달):
zsh -c 'autoload -U zmv; zmv -v -- $1 $2' zsh 'report<1-3>.txt' 'my$f'
이 답변은 이름 충돌 문제를 무시합니다.
답변4
MV를 사용할 수 있습니다.
for f in *.txt;do mv $f "my$f"; done
또는 이름 바꾸기를 사용할 수 있습니다. 배포판에 따라 설치해야 할 수도 있습니다.
rename -v -n 's/report/myreport/' *.txt
이름 바꾸기(옵션 *) 's/oldname/newname/' file1 file2 또는 *.extension 사용
Archlinux를 사용하는 경우 이것이 작동하지 않으면 다음을 사용하십시오.
rename -v report myreport *.txt
옵션을 확인하려면 man rename을 확인하세요.