find 명령을 사용하여 파일 이름에서(1)을 제거하는 방법

find 명령을 사용하여 파일 이름에서(1)을 제거하는 방법

저는 최근에 Mac OS 10.7(Lion)에서 XLD를 사용하여 모든 FLAC 파일을 더 낮은 샘플 속도인 44.1kHz와 비트 심도 24비트로 변환했습니다(iPhone/iPod는 이보다 높은 것을 지원하지 않기 때문입니다).

이전 파일을 모두 덮어쓰라고 XLD에 지시했지만 XLD는 (1)각 파일의 끝에 를 추가했습니다.

some_song.m4a

도착하다

some_song(1).m4a

(1)이제 변환하는 모든 FLAC 파일에서 해당 파일을 제거 하고 싶습니다 .

일부 프로그램이나 AppleScript를 사용하여 파일 이름을 바꿀 수 있다는 것을 알고 있지만 구식 명령줄 방식을 사용하는 방법을 배우고 싶습니다.

나는 이것이 find . -name *\(1\).m4a변환된 모든 FLAC 파일을 얻을 것이라는 것을 알고 있습니다.

-exec그 다음에는 일부 처리를 수행 하고 발견된 모든 파일의 이름을 바꿔야 한다는 것을 알았습니다. mv그런데 원본 파일명을 유지하고 (1).

수정하고 싶지 않은 파일 이름 부분을 저장하기 위해 그룹 정규식 캡처를 수행해야 할 수도 있습니까? 아니면 한 줄로 모든 작업을 수행하는 것이 불가능할 수도 있으므로 쉘 스크립트를 작성해야 합니다(이 작업이 매우 불편하지만 시도해 볼 의향이 있습니다).

어떤 팁이나 제안이라도 환영합니다! 감사해요!

답변1

find꼭 필요한 경우가 아니면 출력을 구문 분석하지 마십시오 . Unix 파일 시스템에서 파일 이름은 문자열(일반적인 오해)이 아니라바이너리 블롭/및 null 문자를 제외한 모든 문자를 포함할 수 있습니다 . 파일 이름을 안전하고 정확하게 구문 분석하는 것은 충분히 고통스럽습니다. 99%의 시간 동안 완전히 피하고 싶을 것입니다(이것이 얼마나 털이 많고 sed아래 표현식이 얼마나 털이 있는지 확인하십시오).@yarek의 답변예, 심지어 모든 경우에 해당되는 것은 아닙니다.) 다행히도 이 경우 더 쉬운 방법이 있습니다.

find . -name '*(1).m4a' -execdir sh -c \
'for arg; do mv "$arg" "${arg%(1).m4a}".m4a; done' _ {} \+

답변2

Debian과 Ubuntu에서는 이를 사용하여 rename 's/\(1\)//' *.m4a문제를 해결할 수 있습니다.

답변3

zsh에서는 다음을 사용하십시오.즈마브:

autoload zmv      # you can put this line in your .zshrc
zmv '(*)\(1\)(*)' '$1$2'

두 번째 인수(새 이름)에서는 $1소스 스키마의 $2괄호로 묶인 그룹을 참조합니다 . (PATTERN)이 이름 바꾸기를 작성하는 또 다른 방법은 다음과 같습니다.

zmv '(*)' '${1/\(1\)/}'

답변4

다음은 이 작업을 수행하는 작은 스크립트입니다.

for var in `find . -type f -name "*(1).m4a"`; do
    new=`echo $var | cut -d'(' -f1`;
    mv $var $new.m4a;
done

관련 정보