저는 디렉토리 트리의 일부 영화를 수정하기 위해 작은 스크립트를 작성 중이고 bash for 루프나 이와 유사한 것을 사용하여 트리를 구문 분석하고 싶습니다.
그래서 파일을 찾기 시작했어요
find -iname *.mov -or -iname *.mkv -or -iname *.avi
그는 예상대로 각 유형의 파일 몇 개를 보여주었습니다.
그러나 나는 이것으로 결과를 반복하려고 시도했습니다(일부 디렉토리 이름에 공백이 있기 때문입니다).
find -iname *.mov -or -iname *.mkv -or -iname *.avi -print0 | while read -d $'\0' line
do
echo $line
done
하지만 이제 그는 avi 파일만 반환합니다! 그래서 내가 -print0을 추가하면 그는 내 -or와 또 다른 -iname을 무시하는 것 같습니다.
무슨 일이야, 내가 뭘 놓치고 있는 거지?
결과를 반복하기 전에 find 결과를 tmpfile로 보내야 합니까?
답변1
작업은 마지막 테스트( 이 경우) -print0
에만 추가됩니다 . -iname *.avi
일치하는 항목마다 인쇄 작업을 반복하거나 일부 그룹화를 수행합니다.
find -iname '*.mov' -print0 -or -iname '*.mkv' -print0 -or -iname '*.avi' -print0
또는
find \( -iname '*.mov' -or -iname '*.mkv' -or -iname '*.avi' \) -print0
그리고 맨 페이지 *
에서 다음 사항에 주의하십시오 .find
물론 패턴을 인용해야 합니다. 그렇지 않으면 쉘이 패턴에 있는 와일드카드 문자를 확장합니다.
find
이 옵션이 있으면 좀 더 간결한 형식을 사용할 수 있습니다.
find -iregex '.*\.\(mov\|mkv\|avi\)$' -print0
-type f
(이러한 확장자를 사용하여 디렉터리 이름을 지정하는 경우 이를 추가할 수 있습니다.)