이 find 명령이 작동하지 않는 이유는 무엇입니까? .mp3, .wav 및 .m4a 파일을 찾기 위한 정규식 및 변형

이 find 명령이 작동하지 않는 이유는 무엇입니까? .mp3, .wav 및 .m4a 파일을 찾기 위한 정규식 및 변형
2015.10.25 Move on and Be Blessed.wav             dummy.m4a
2015.11.17 BS Full.wav.mp3                        
2015.11.17 BS MOL.wav.mp3           

find . -name '*.mp3' -o -name '*.wav' -o -name '*.m4a' -print0

하지만 이 명령은 작동합니다 find . -name "*.wav" -o -name '*.mp3' -print0

나는 읽고 있었다 find 명령을 사용하여 여러 확장자를 검색하는 방법그리고 neroAacEnc를 사용하여 하위 디렉터리의 모든 .wav 파일을 .aac로 변환하는 방법은 무엇입니까?

내 정규식 버전이 작동하지 않는 이유는 무엇입니까? find . -regex '*\.\(.mp3\|.wav\|.m4a\)' -print0 이 정규식 명령을 두 번째 참조 게시물에 설명된 후속 명령으로 파이프하여 find . -name "*.wav" -print0 | while read -d $'\0' file; do ffmpeg -i "$file" -c:a libfdk_aac -vbr 3 output.m4a "${file%wav}m4a"; done해당 find . -name "*.wav" -print0명령을 바꿀 수 있습니까?

답변1

귀하의 질문에 시작 부분이 누락된 것 같지만 find-regex 명령이 작동하지 않는 이유는 .*("무엇이든"에 대한 glob 구문)뿐만 아니라 *("무엇이든"에 대한 정규식 구문)로 시작해야 하기 때문입니다. .Extension 앞에 불필요한 것이 있습니다 .

find . -regex '.*\.\(mp3\|wav\|m4a\)' -print0

파이프라인은 제대로 작동할 것입니다. echo그것을 앞에 배치하여 테스트 하십시오 ffmpeg. 내 본능은 파일에서 테스트할 수 있는 함수나 스크립트를 작성하거나 파일에 개행 문자가 없는지 확인하는 것입니다. 공백은 사용자가 좋아하지만 줄 바꿈은 고통스럽습니다.

답변2

유효한 정규식이 아니기 때문에 정규식이 작동하지 않습니다.

*정규식에서는 작동하지 않습니다. 거의 동일한 동작을 얻으려면 필요 .*하지만 정규식은 어쨌든 하위 문자열 일치이므로 일반적으로 아무것도 필요하지 않습니다.

.또한 일치시키려는 리터럴을 이스케이프해야 합니다 . 그렇지 않으면 모든 문자를 의미하기 때문입니다. 첫 번째는 피하고 .두 번째는 피했기 때문에실제로성냥.

.?mp3

나는 당신이 그럴 것 같지 않다고 생각합니다.

그래서:

find -regex '\.(mp3|wav|m4a)$' 

성공할 수도 있습니다.

나는 지금 Unix 시스템을 사용하고 있지 않기 때문에 첫 번째 패턴이 작동하지 않는 이유를 모르겠습니다. 하지만 그건 -print0전부가 아니라 마지막 항목에 적용되기 때문인 것 같아요 . 어쨌든, 첫 번째 예 - wav인쇄되는 파일이 있습니까?

괄호가 필요할 수 있으므로:

find \( -name '*.wav' -o -name '*.mp3' -o -name '*.m4a' \) -print0 

관련 정보