모든 폴더 및 파일 이름의 문자열을 다른 문자열로 재귀적으로 바꾸는 방법은 무엇입니까? 저는 Red Hat 6을 실행 중이며 다음을 통해 찾을 수 있습니다.
find . -name \*string\*
파일의 문자열을 사용하여 이 작업을 수행했습니다.
find . -type f -exec sed -i 's/string1/string2/g' {} +
하지만 비슷한 방식으로 모든 파일 이름을 어떻게 바꿀 수 있습니까?
답변1
사용 find
및 rename
:
find . -type f -exec rename 's/string1/string2/g' {} +
이 명령의 의미 중 하나는 현재 디렉터리( ) 에서 모든 파일( )을 find . -type f
검색한다는 것입니다 .-type f
.
이
-exec
옵션은find
찾은 각 파일에 대해 명령이 실행되도록 지시합니다.이
rename
명령은 파일 이름을 바꾸는 데 사용됩니다. 여기에 사용된 구문은 Perl 버전의rename
.'s/string1/string2/g'
검색할 내용과 바꿀 내용을 지정하는 정규식 입니다 . 이 경우string1
교체할 문자열은string2
교체 문자열입니다. 후행 항목은 파일 이름의 모든 항목을/g
대체합니다 .string1
이
{}
기호는 발견된 파일 이름에 대한 자리 표시자입니다find
.+
마지막 명령은find
여러 파일 이름을 rename 명령에 한 번에 전달하도록 지시합니다. 이는 각 개별 파일에 대해 rename을 호출하는 것보다 더 효율적입니다.
따라서 요약하면 이 명령은 현재 디렉터리의 모든 파일을 검색하고 rename
발견된 각 파일의 파일 이름을 모두 바꾸는 명령을 실행합니다 string1
.string2
답변2
for
및 mv
명령을 사용하여 모든 파일 이름을 바꿀 수 있습니다.
abc
여기서는 이름으로 시작하는 모든 텍스트 파일을 다음으로 바꿉니다.xyz
for file in abc*.txt; do mv -v "$file" "${file/abc/xyz}"; done
다음 명령은 모든 폴더의 파일을 재귀적으로 교체합니다.
for file in `find . -type f -name 'abc*.txt'`; do mv -v "$file" "${file/abc/xyz}"; done
답변3
zsh
사용하기가 더 쉽습니다 zmv
.
autoload zmv # best in ~/.zshrc
zmv '(**/)(*string1*)' '$1${2//string1/string2}'
로 변경
zmv '(**/)(*string1*)(#qD)' '$1${2//string1/string2}'
숨겨진 파일이나 숨겨진 디렉터리의 파일 이름도 바꾸려는 경우.