모든 하위 디렉터리에서 동일한 이름을 가진 모든 파일의 이름을 다른 이름으로 바꾸는 방법

모든 하위 디렉터리에서 동일한 이름을 가진 모든 파일의 이름을 다른 이름으로 바꾸는 방법

다음 이름을 가진 파일이 포함된 중첩된 디렉터리가 있는 하위 디렉터리가 많이 있습니다.

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 ';'

이것은 -TGNU 확장입니다. 이것이 없으면 이름이 지정된 디렉토리가 이미 존재하는 경우 이름을 로 mv output.txt output_modified.txt바꿀 수 있습니다 output.txt.output_modified.txt/output.txtoutput_modified.txt

rename한 번에 여러 파일의 이름을 바꿀 수 있으므로 파일당 하나씩 호출하는 것보다 더 효율적이므로 여기에서 유용할 수 있지만 mv다음이 필요합니다.

  1. 도착하다rename당신의 것이 Perl 기반인지 확인하십시오, 게임의 바보가 아닙니다 util-linux. 때로는 file-rename또는 prename또는 이라고도 합니다 perl-rename.

  2. 다음과 같이 호출하세요.

    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 및 병렬을 설치해야 합니다.

관련 정보