파일 이름에서 단어를 바꾸어 여러 파일의 이름을 바꾸는 방법은 무엇입니까?


36

ACDC를 AC-DC로 교체

예를 들어이 파일들이 있습니다

ACDC-Rock N 'Roll은 소음 공해가 아닙니다 .xxx

ACDC-로커 .xxx

ACDC-스릴로 쏴라 .xxx

나는 그들이되기를 원합니다 :

AC-DC-로크 앤 롤은 소음 공해가 아닙니다 .xxx

AC-DC-로커 .xxx

AC-DC-스릴로 쏴라 .xxx

나는이 작업에 sed 또는 awk가 사용된다는 것을 알고 있습니다. 나는 아무것도 할 수 없으므로 도움을 요청하고 있습니다 =)이 작업에 대한 전체 쉘 명령을 제공해 주시겠습니까?

피드백 : OSX 사용자를위한 솔루션


1
여기에 더 큰 질문이 있다고 생각합니다. 일반적으로 mp3 파일 이름을 수정하려고합니까? 사람들이이 작업을 수행하기 위해 수년 동안 작성한 많은 스크립트가 있습니다. 내가 사용한 것 중 하나가라고 생각 mp3fixer합니다.
Phil Hollenback

아니 그것은 mp3에 관한 것이 아닙니다. 비슷한 이름의 거대한 파일을 관리해야하며 모든 것이 교체되거나 고정되어야합니다 ... 일반적인 상황이므로 모든 파일의 이름을 바꾸려면이 멋진 솔루션이 필요합니다.
holms

답변:


45
rename 's/ACDC/AC-DC/' *.xxx

...에서 man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

예를 들어 확장자가 "* .bak"인 모든 파일의 이름을 바꾸려면 다음과 같이 말할 수 있습니다.

rename 's/\.bak$//' *.bak

대문자 이름을 더 낮은 이름으로 변환하려면

rename 'y/A-Z/a-z/' *

5
많은 리눅스 컴퓨터는 util-linux에서 이름이 바뀌어 정규 표현식이 아닌 간단한 대체를 구현합니다 . 따라서 아무 것도하지 않고 이름 바꾸기가 자동으로 실패하면 잘못 사용하고있을 것입니다 rename.
Phil Hollenback

나는 이것을 오랫동안 찾고 있었다! thnx!
holms

@PhilHollenback 그렇다면 올바른 것을 찾고 설치하는 방법? :)
henry

공백 대신 파일 이름에 밑줄이 있으면 작동하지 않습니다. 어떻게 해결할 수 있습니까?
unfa

13

이 답변에는와 같은 이단을 제외하고 다른 모든 답변의 좋은 부분이 포함되어 있습니다 ls | while read.

현재 디렉토리 :

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

하위 디렉토리 포함 :

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

줄 바꿈 문자는 실제로 파일 이름에 포함되지 않으므로 공백이 포함 된 이름으로 작업하는 동안 더 간단 할 수 있습니다.

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

9

renamePhil 의 util-linux 버전을 사용하려면 (Ubuntu에서는이라고 함 rename.ul) :

rename ACDC AC-DC ACDC*

또는

rename.ul ACDC AC-DC ACDC*

1
귀하의 변종이 가장 좋습니다 =) 구글에서 찾기 및 보내기 및 awk에 대한 너무 많은 바보 같은 기사 ...
holms

4

bash 쉘 사용

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

참고 : using find은 현재 디렉토리와 그 아래 디렉토리를 처리합니다.


1

껍질에 따라 다릅니다. zsh에서는 다음을 수행합니다.

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

아마도 최상의 솔루션은 아니지만 작동합니다.


1

bash 사용 :

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

당신이있는 경우 rename프로그램이 설치 :

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