find 명령을 사용하여 파일 이름에서 (1)을 제거하는 방법 싶습니다 . 파일 이름을 바꾸기 위해 일부

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

XLD에 이전의 모든 파일을 덮어 쓰라고했지만 XLD (1)는 다음과 같이 파일 끝에 끝에 a 를 추가했습니다 .

some_song.m4a

some_song(1).m4a

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

파일 이름을 바꾸기 위해 일부 프로그램이나 AppleScript를 사용할 수도 있었지만 구식 명령 줄을 사용하여 배우고 싶었습니다.

나는 아는 find . -name *\(1\).m4a모든 변환 FLAC 파일을 잡아 것입니다.

다음으로 나는 찾은 모든 파일로 무언가를 -exec하고 mv이름을 바꿔야한다는 것을 알고 있습니다. 그러나 내가 알아낼 수없는 것은 원래 파일 이름을 유지하고 만 제거하는 방법 (1)입니다.

어쩌면 수정하고 싶지 않은 파일 이름의 일부를 저장하기 위해 그룹 정규식 캡처를 수행해야합니까? 또는 한 줄로 모든 것을 할 수는 없으며 쉘 스크립트를 만들어야합니다.

모든 팁이나 제안을 환영합니다! 감사!



답변

find최후의 수단을 제외하고 출력 을 구문 분석하지 마십시오 . Unix 파일 시스템에서 파일 이름은 문자열 (일반적인 오해)이 아니라 null 문자를 제외한 모든 문자를 포함 할 수있는 이진 blob 이라는 것을 알아야합니다 /. 파일 이름을 안전하고 올바르게 파싱하면 99 %의 시간을 낭비 하지 않아도됩니다 ( @yarek의 대답sed 에서 표현이 얼마나 털이 많은지 , 심지어 모든 경우를 다루지 않는지보십시오) . 고맙게도이 경우에는 훨씬 간단한 접근 방식이 있습니다.

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


답변

데비안과 우분투에서는 rename 's/\(1\)//' *.m4a문제를 해결하는 데 사용할 수 있습니다 .


답변

zsh에서 zmv 사용 :

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

두 번째 인자 (새 이름)에서, $1그리고 $2괄호 안의 그룹을 참조 (PATTERN)소스 패턴. 이 이름을 바꾸는 또 다른 방법은

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


답변

다음 접근 방식은 생성 된 명령 실행 하기 전에 미리 보거나 제거 할 수있는 기능을 제공 하며, 이식성 이 뛰어납니다 . bash뿐만 아니라 GNU sed뿐만 아니라 mac에서도 작동해야합니다. find(1) 명령이 없는 시스템에서도 문제없이 (1)로 대체 할 수 있습니다 du.

find . -name '*(1).m4a' |
sed 's/\(.*\)(1).m4a$/mv & \1.m4a/' 

인쇄 된 명령에 만족하면 | sh -x추가 된 상태로 다시 실행하십시오 .

파일 이름에 공백에 대해 우려하는 경우, 다른 추가 의를 모든 공간을 탈출 :

find . -name '*(1).m4a' |
sed -e 's/ /\\ /g' -e 's/\(.*\)(1).m4a$/mv & \1.m4a/'

다른 특수 문자가 예상되면 조금 까다로워집니다.

find . -name '*(1).m4a' |
sed -e "s/'/'\\\\''/g" -e 's/\(.*\)(1).m4a$/mv '\''&'\'' '\''\1.m4a'\'/

첫 번째 함수는 모두 이스케이프 된 문자열 '의 중간에 문자 그대로 사용되도록 모든 형식으로 변환 '...'합니다. 두 번째 함수는 인수가 안에 포함 된 mv 명령을 생성 합니다 '...'.


답변

이를 수행하는 작은 스크립트는 다음과 같습니다.

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


답변