저는 최근에 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