여러 하위 디렉터리의 파일 이름을 바꾸는 방법은 무엇입니까?

여러 하위 디렉터리의 파일 이름을 바꾸는 방법은 무엇입니까?

3개의 하위 디렉터리가 있다고 가정해 보겠습니다. 모두 .라는 파일이 포함되어 있습니다 old_file_name. 이제 하나의 명령으로 이름을 모두 new_file_name.

나는 노력했다

sudo find . -name "old_file_name" -exec rename old_file_name new_file_name {} \;

하지만 다음과 같은 오류가 표시됩니다.

'strict subs'(사용자 제공 코드에서)를 사용할 때는 기본 단어 'new_file_name'이 허용되지 않습니다.

답변1

perl이 변형은 먼저 파일 이름과 파일 목록을 변환하는 rename일부 코드를 인수로 사용합니다 .perl

귀하의 시도에서 (코드 rename 에 대한 파일 인수로 찾은 파일을 사용하여효과가 없습니다) 및동일하게 취급되고이것은 의미가 없습니다. 그렇지 않은 경우old_file_name로서 호출합니다 .perluse strict"old_file_name"new_file_namefind

여기에서 다음을 수행할 수 있습니다.

find . -depth -name old_file_name -execdir mv old_file_name new_file_name \;

-execdir표준은 아니지만 꽤 일반적입니다. 대조적으로 -exec, 프로세스의 현재 작업 디렉토리가 아닌 선택된 각 파일의 상위 디렉토리에서 명령을 실행합니다 find.

아니요 -execdir, 다음과 같이 할 수 있습니다.

find . -depth -name old_file_name -exec sh -c '
  for file do
    mv "$file" "${file%/*}/new_file_name"
  done' sh {} +

답변2

여기에서 파일 이름을 매우 간단하게 변환하고 있으므로 rename. 정확한 이름 find도 사용할 필요는 없을 것 같습니다.

하위 디렉터리가 많다고 가정하면 각 하위 디렉터리에는 일부 파일과 사용자 h파일이 포함될 수 있습니다.

각 파일의 이름을 로 h바꾸 려면 he가장 간단한 해결책은 해당 파일을 반복하여 mv새 이름으로 변경하는 것입니다. 이 경우 e이름에 문자를 추가하기만 하면 매우 간단해집니다.

for name in ./*/h; do
    mv -i "$name" "$name"e
done

이는 패턴 확장으로 생성된 모든 경로 이름을 통해 반복됩니다 ./*/h. 각 이름에 대해 이 명령은 끝에 이름을 추가하는 mv -i데 사용됩니다 . e옵션을 사용하면 기존 이름을 바꾸기 전에 확인 메시지가 표시 됩니다 -i.mvmv


질문을 업데이트한 후 업데이트하세요.

old_file_name각 하위 디렉터리에서 호출되는 모든 파일의 이름을 다음으로 바꾸려면 다음을 수행합니다 new_file_name.

for name in ./*/old_file_name; do
    mv -i "$name" "${name##*/}/new_file_name"
done

또는

for name in ./*/old_file_name; do
    mv -i "$name" "$( dirname "$name" )/new_file_name"
done

두 루프 모두에서 대상 이름은 이전 파일 이름과 동일한 디렉터리에 있는 새 파일 이름을 참조하는 방식으로 계산되어야 합니다.

첫 번째 루프에서는 표준 변수 대체를 사용하여 디렉토리 경로를 찾습니다. 그러면 마지막 항목부터 마지막 ​​항목까지 모든 항목이 ${name##*/}삭제됩니다 . 두 번째 루프에서는 거의 동일한 작업을 수행하는 를 사용합니다. 그런 다음 결과 문자열 끝에 전체 경로 이름을 추가하여 새 파일 이름을 만듭니다.$name/dirname "$name"/new_file_name


마지막으로 Perl rename유틸리티를 사용하십시오.

rename 's/old_file_name$/new_file_name/' */old_file_name

명령에 대한 문제점은 첫 번째 인수로 Perl 표현식을 사용하지 않는다는 것입니다. 이 rename유틸리티는 Perl 표현식을 사용하여 주어진 경로 이름을 변환하고 이를 각 경로 이름에 차례로 적용합니다. 위 명령에서는 간단한 대체 표현식을 사용하여 경로 이름의 파일 이름 부분을 새 파일 이름으로 바꿉니다.

대체 항목은 전체 경로 이름을 수신하므로 실수로 경로 이름을 바꾸는 것을 방지하려면 문자열 끝( $) 과 일치해야 합니다.목차이름이 지정된 경로 이름에 old_file_name.

답변3

Stéphane Chazelas의 답변에 추가하여,

따옴표를 사용해야 할 수도 있습니다. 파일 이름에 공백이 포함된 경우 따옴표를 사용해야 old_file_name하므로 'old_file_name'. 일반적으로 이런 경우인 것 같습니다. 많은 파일을 작업하는 경우 '{}'대신 {}. 현 시점에서는 이 옵션을 사용할 때 칭찬을 인용하는 것이 적절한지 여부를 말할 수 없습니다 -execdir.

또한 확인해 주세요.찾다매뉴얼 페이지에는 보안 경고가 있으므로 이 상황에 적용되는 것 같습니다.

관련 정보