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