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


41

현재 폴더의 모든 파일 / 하위 디렉토리 이름을 어떻게 바꾸나요?

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

File 1
File 2
File 3
Dir 1
Dir 3

로 이름을 바꿔야합니다

File_1
File_2
File_3
Dir_1
Dir_3

답변:


36

서브 디렉토리의 파일 이름도 변경해야하고 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...) 설정하면 문제가 해결됩니다.


find -maxdepth 1OP가 현재 폴더에서 작동하는 것에 대해 요청한 내용을 정확하게 수행하는 데 사용해야 합니다.
Caleb

1
find -depth옵션을 사용 하면를 제거 할 수 있습니다 sort.
glenn jackman

@ glenn jackman : 고맙습니다. 제 솔루션이 잘못되었음을 이해합니다.
enzotib

2
변경 -name '* *'에 대한 -name '*_*'변경 "${1// /_}""${1//_/.}"
enzotib

1
@kroiz : "패턴 대체"라고합니다. bash의 맨 페이지 에서 찾을 수 있습니다 .
enzotib

34

모든 쉘에서 이름에 공백이 포함 된 파일을 반복 할 수 있습니다. 밑줄로 공백을 바꾸는 것은 bash, ksh 및 zsh에서 ${VARIABLE//PATTERN/REPLACEMENT}구문을 사용하면 쉽습니다 .

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

데비안, 우분투 및 파생 상품에서는 Perl을 사용할 수 있습니다 rename(다른 배포판은 다른 프로그램을 제공하므로 rename해당 프로그램은 여기서 유용하지 않습니다).

rename 's/ /_/g' *

필수 zsh 솔루션 :

autoload zmv
zmv '(*)' '${1// /_}'

필수 POSIX 솔루션 :

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done

"이름 바꾸기"명령 끝에있는 'g'는 무엇을 의미합니까? 나는 매뉴얼에서 그것을 보지 못했다.
JulianLai

디렉토리 이름 만 바꾸는 방법? 파일 이름을 바꾸고 싶지 않습니다.
JulianLai

@JulianLai s/…/…/g는 모든 발생을 대체하는 것을 의미합니다. 매뉴얼에 잘 설명되어 있지 않습니다 . 디렉토리의 이름을 바꾸려면 여러 가지 방법이 있으며 검색하십시오 (이전에 본 것 같습니다). 새로운 디렉토리를 찾을 수 없으면 새로운 질문을하십시오.
Gilles 'SO- 악마 그만'

큰 ...이 모든 이름을 바꾸려면 나에게 도움 _MG_blah.JPGIMG_blah.JPG.
Abinash Dash

13

rename이것을 위해 사용할 수 있습니다 (여기서는 하나가 util-linux아니라 에서 가정 perl) :

cd /path/to/dir
rename ' ' _ *\ *

이름에서 모든 파일과 디렉토리 공간을 찾은 다음 공백을 밑줄로 바꿉니다. glob 파일 일치를 사용하므로 시작하려면 올바른 디렉토리에 있어야합니다.

재귀 적 일치를 원한다면 rename디렉토리에서 자신의 이름이 변경된 항목을 잡기 위해 몇 번 실행해야 할 수도 있습니다 .

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!

2
" rename일 교체에 의해 지정된 파일의 이름을 바꿉니다 첫번째 의 발생을 에서 그들의 이름 ."이 이름에 하나의 공간 파일에만 작동합니다 그래서. ( rename루프를 호출 할 수는 있지만 실제로 올바른 도구는 아닙니다.)
Gilles 'SO- 악의를 그만두십시오'

2

mmv설치된 경우 다른 옵션이 있습니다 .

mmv \*\ \* \#1_#2

이것은 첫 번째 공백 만로 바꾸고 _여러 공백이있는 이름은 작동하지 않습니다.
Gilles 'SO- 악마 그만해'

응, 네 말이 맞아 혼란을 드려 죄송합니다.
glglgl

1

Caleb과 Gilles의 답변을 바탕으로 Debian / Ubuntu에서 파일을 재귀 적으로 이름을 바꾸는 데 도움이되었습니다.

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

참고 : 이름을 바꿀 파일과 방법을 미리 보려면 -n스위치를 rename다음 과 함께 사용하십시오 .

rename -n 's/ /_/g' **

또 다른 참고 사항 : 설정 globstar**모든 하위 디렉토리의 파일과 일치하므로 현재 디렉토리 만 원하는 경우 globstar를 설정하거나 *대신 사용하지 마십시오 **.

참고 사항 : rename검색어가 여러 번있는 파일에 대해서는 명령을 두 번 이상 실행해야합니다.


디렉토리에 공백이없는 경우에만 작동합니다. (의 이름 변경 a b/c da_b/c_d작동하지 않을 것입니다, 당신은 이름을 먼저 필요할 것 a b/c d으로 a b/c_d, 다음 a ba_b).
Stéphane Chazelas

@Stephane : 동일한 rename명령을 두 번 실행한다는 의미 입니까?
Markus Pscheidt

글쎄, 공백이있는 중첩 된 수준의 디렉토리가있는 것처럼 더 많이. 이상적으로는 디렉토리 깊이를 먼저 순회하고 승인 된 솔루션에서와 같이 파일의 기본 이름 만 변환하려고합니다. 또한 bash는 **도트 파일을 제외하고 심볼릭 링크를 통과합니다.
Stéphane Chazelas

0

정규 표현식에서 플래시가 아니고 (나는 아닙니다!) kde 용으로 설계된 응용 프로그램을 실행할 수 있다면 (kde-k 데스크탑을 사용하거나 라이브러리가 설치되어 있음) krename은 훌륭한 그래픽 유틸리티입니다. 변경 사항을 커밋 하기 전과 후에 볼 수 있습니다 . 옵션으로 간단한 변환이 많이 있으며 정규 표현식도 지원합니다. 여러 순차 변환을 하나의 이름으로 결합하여 한 번에 하나의 복잡한 변환을 수행 할 필요가 없습니다. 또한 이름 변경이 적용된 후 동일한 파일의 이름을 계속 바꾸는 옵션도 있습니다.

자주 사용하지는 않지만 실제로 사용하면 빠르고 쉽게 작업을 수행 할 수 있습니다. 다운로드 한 다양한 미디어 파일의 이름을 바꿀 때 매우 유용하므로 시스템에서 균일하게 관리 할 수 ​​있습니다. 프로그램을 사용하는 동안 참조 할 수 있도록 krename 매뉴얼을 별도로 다운로드하는 데 도움이됩니다.

http://www.krename.net/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.