다음 이름을 가진 파일이 포함된 중첩된 디렉터리가 있는 하위 디렉터리가 많이 있습니다.
output.txt
. 이 모든 파일의 이름을 다음으로 바꾸고 싶습니다.
output_modified.txt
나는 노력했다
find . -type f -name "output.txt" -execdir rename 's/output\.txt/output_modified\.txt/' '{}' \;
하지만 오류가 발생합니다.
rename: not enough arguments
내가 놓친 논쟁이 있습니까? 아니면 필요한 것을 수행하는 더 좋은 방법이 있습니까?
답변1
필요하지 않습니다 rename
. 다음과 같이 하세요.
find . -name output.txt -type f -execdir mv -T output.txt output_modified.txt ';'
이것은 -T
GNU 확장입니다. 이것이 없으면 이름이 지정된 디렉토리가 이미 존재하는 경우 이름을 로 mv output.txt output_modified.txt
바꿀 수 있습니다 output.txt
.output_modified.txt/output.txt
output_modified.txt
rename
한 번에 여러 파일의 이름을 바꿀 수 있으므로 파일당 하나씩 호출하는 것보다 더 효율적이므로 여기에서 유용할 수 있지만 mv
다음이 필요합니다.
도착하다
rename
당신의 것이 Perl 기반인지 확인하십시오, 게임의 바보가 아닙니다util-linux
. 때로는file-rename
또는prename
또는 이라고도 합니다perl-rename
.다음과 같이 호출하세요.
find . -name output.txt -type f -exec rename ' s|\.txt\z|_modified.txt|' {} +
이 {} +
형식 에서는 find
여러 개의 to가 한 번에 전달됩니다 rename
.
일부 Perl 기반 변형은 rename
파일 목록을 사용하여 표준 입력에서 NULL 구분 기호의 이름을 바꿀 수도 있으므로 이러한 파일을 사용하면 다음을 수행할 수도 있습니다.
find . -name output.txt -type f -print0 |
rename -0 's|\.txt\z|_modified.txt|'
답변2
IMO 이름 바꾸기, 조회 등은 혼란스럽고 사용하기 어렵습니다. 이런 종류의 것이 사용하기 더 쉽다고 생각합니다 mv
.https://github.com/sharkdp/fdGNU와 병행합니다.
fd output.txt | parallel --dry-run mv {} {.}_modified.txt
parallel
각 입력 줄에 대해 입력한 명령을 실행합니다(이 경우 fd
경로 목록이 제공됩니다). {}
"현재 입력"을 의미합니다. {.}
현재 입력을 나타내지만 확장자는 제거됩니다. --dry-run
실행될 명령만 인쇄되며 parallel
표시되지 않습니다. 먼저 실행한 다음 --dry-run
만족스러우면 실행해야 합니다.
패키지 관리자에서 fd 및 병렬을 설치해야 합니다.