현재 폴더의 모든 파일/하위 디렉터리 이름을 바꾸는 방법은 무엇입니까?
공백이 있는 파일과 하위 디렉터리가 많고 모든 공백을 밑줄로 바꾸고 싶다고 가정해 보겠습니다.
File 1
File 2
File 3
Dir 1
Dir 3
로 이름을 바꿔야합니다
File_1
File_2
File_3
Dir_1
Dir_3
답변1
모든 셸에서 이름에 공백이 포함된 파일을 반복할 수 있습니다. bash, ksh 및 zsh에서는 공백을 밑줄로 바꾸는 것이 쉽습니다 ${VARIABLE//PATTERN/REPLACEMENT}
.
for x in *" "*; do
mv -- "$x" "${x// /_}"
done
Debian, Ubuntu 및 그 파생 제품에서는 Perl을 사용할 수 있습니다 rename
(예를 들어 다른 배포판은 다른 프로그램을 제공하지만 rename
여기서는 도움이 되지 않습니다).
rename 's/ /_/g' ./*
필수 zsh 솔루션:
autoload zmv
zmv '(*)' '${1// /_}'
또는:
autoload zmv
zmv '*' '${f// /_}'
필수 POSIX 솔루션:
for x in *" "*; do
y=$(printf %s/ "$x" | tr " " "_")
mv -- "$x" "${y%/}"
done
답변2
하위 디렉터리의 파일 이름도 바꿔야 하고 조건자를 find
지원하는 경우 -execdir
다음을 수행할 수 있습니다.
find /search/path -depth -name '* *' \
-execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;
-depth
옵션을 제안 find
하고 생각하게 해준 @glenn jackman에게 감사드립니다.
GNU/Linux 시스템을 포함한 일부 시스템에서는 find
이름에 유효한 문자를 형성하지 않는 공백과 바이트 시퀀스가 포함된 파일이 발견되지 않을 수 있습니다(일반적으로 이름에 문자 집합 파일에 인코딩된 비ASCII 문자가 포함된 미디어). 로캘). 로케일을 C
( 그림 참조 LC_ALL=C find...
)로 설정하면 문제가 해결됩니다.
답변3
이를 위해 사용할 수 있습니다 rename
(여기서는 에서 나온 것을 가정하고 util-linux
, 저것도 아니고 perl
삭제된 것도 가정합니다)하나):
cd /path/to/dir
rename ' ' _ *\ *
이름에서 모든 파일 및 디렉토리 공간을 찾아 공백을 밑줄로 바꿉니다. glob 파일 일치를 사용하므로 시작하려면 올바른 디렉터리에 있어야 합니다.
rename
재귀 일치를 수행하려는 경우 그렇게 할 수 있지만 디렉터리에서 이름이 변경된 항목을 찾으려면 몇 번 수행해야 할 수도 있습니다 .
cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
답변4
Caleb과 Gilles의 답변을 바탕으로 Debian/Ubuntu에서 다음과 같이 파일 이름을 재귀적으로 바꾸는 방법입니다.
cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **
참고: 이름이 바뀔 파일과 방법을 미리 보려면 다음 -n
스위치를 사용하십시오 rename
.
rename -n 's/ /_/g' **
또한 참고: 설정은 모든 하위 디렉터리의 파일과 일치 globstar
하므로 **
현재 디렉터리만 원하는 경우 globstar를 설정하지 *
않거나 **
.
또한 참고: rename
검색어가 여러 번 나타나는 파일의 경우 명령을 여러 번 실행해야 합니다.