현재 디렉토리의 모든 파일 이름에서 한 문자를 다른 문자로 바꾸는 방법은 무엇입니까?

현재 디렉토리의 모든 파일 이름에서 한 문자를 다른 문자로 바꾸는 방법은 무엇입니까?

현재 폴더의 모든 파일/하위 디렉터리 이름을 바꾸는 방법은 무엇입니까?

공백이 있는 파일과 하위 디렉터리가 많고 모든 공백을 밑줄로 바꾸고 싶다고 가정해 보겠습니다.

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검색어가 여러 번 나타나는 파일의 경우 명령을 여러 번 실행해야 합니다.

관련 정보