이 파일의 이름을 즉시 바꾸려면 어떻게 해야 합니까? [복사]

이 파일의 이름을 즉시 바꾸려면 어떻게 해야 합니까? [복사]

파일이 여러 개 있는데 정규식을 사용하여 이름을 바꾸고 싶습니다. 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을 확인하세요.

관련 정보