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
로서 호출합니다 .perl
use strict
"old_file_name"
new_file_name
find
여기에서 다음을 수행할 수 있습니다.
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
.mv
mv
질문을 업데이트한 후 업데이트하세요.
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
.
또한 확인해 주세요.찾다매뉴얼 페이지에는 보안 경고가 있으므로 이 상황에 적용되는 것 같습니다.