도저히 이해할 수 없는 상황에 직면했습니다. 재귀적으로 구조화된 백업 파일이 여러 개 있고 그 중 md5를 계산하려고 합니다. 추가 파일 확장자를 추가하면 출력이 생성되지 않고 프로세스가 종료됩니다(종료 코드 0).
find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -print0 | xargs -0 md5sum
find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mpg" -print0 | xargs -0 md5sum
첫 번째는 잘 작동하지만 두 번째는 출력이 생성되지 않습니다. mpg 파일이 없는 디렉토리에서도 시도해 보았지만 동일한 동작이었습니다.
검색할 매개변수 수에 제한이 있나요? 저는 OSX를 실행 중이고 Macports에서 md5sum을 설치했습니다.
추가 정보
파이프에 뭔가 이상한 점이 있는 것 같습니다. 파일 이름 때문이라고 생각하고 싶습니다. 다른 폴더를 추가로 조사한 결과 find 명령이 작동하는 것으로 보였고 129개의 비디오 파일이 있었으며 그 중 1개는 .mpg였습니다. find+md5sum을 시도하면 파일이 1개만 반환됩니다. 이미지만 포함된 다른 폴더에서 비슷한 명령을 실행했는데 제대로 작동했습니다(80,000개 파일 발견, 80,000개 해시 생성).
Pictures@2006$ find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" | wc -l
128
Pictures@2006$ find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mpg" | wc -l
129
Pictures@2006$ find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mpg" -print0 | xargs -0 md5sum
c21a78f2b2d5ca773b47647315ad91f8 ./pending photos/Video [%]/P007.MPG
Pictures@2006$
또한 처리 중인 두 번째 파일 이름에 구두점, 더하기 기호 및 비ASCII 문자가 포함되어 있는 것도 확인했습니다. 파일 이름 때문에 오류가 발생한 것일 수 있나요? 해결책이 있나요?
/Esplai/+Nou/20060604 Dinar d'últim dia d'esplai[Barbacoa al torrent de l'Escaiola]/MVI_7702.AVI
답변1
명령의 연산자 표현식이 find
사용되지 않은 경우 -o
(는또는) 또는 -a
(그리고-a
), 그들 사이에는 암묵적인 관계가 있습니다. 그리고 그보다 -a
더 밀접하게 결합되어 있다 .-o
find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" \
-o -iname "*.mp4" -o -iname "*.mpg" -print0
다음과 같이 구문 분석됩니다.
find . '(' -type f -a -iname "*.3gp" ')' -o -iname "*.avi" -o -iname "*.mov" \
-o -iname "*.mp4" -o '(' -iname "*.mpg" -a -print0 ')'
따라서 -print0
일치하는 파일(및 디렉토리!)만 인쇄됩니다 *.mpg
. 그렇기 때문에 이 명령을 사용하면 예상한 129개 파일이 아닌 하나의 파일만 처리하게 됩니다.
괄호(쉘에도 특별하므로 따옴표로 묶음)를 사용하여 그룹화를 변경할 수 있습니다.
find . -type f '(' -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" \
-o -iname "*.mp4" -o -iname "*.mpg" ')' -print0 | xargs -0 md5sum
답변2
먼저 언급해야 할 점은 print0이 비표준이며 최상의 솔루션이 아니라는 점입니다. 더 나은 방법은 "execplus"를 사용하는 것입니다.
find dir -type f -exec cmd {} +
그러나 주요 문제는 연산자가 우선 순위를 가지며 -print는 성 major와만 AND로 연결된다는 것입니다.
따라서 올바른 방법은 -o 빨간색 기본 색상을 괄호 안에 넣는 것입니다.
find dir ( -name '*.x1' -o -name '*.x2' ) -exec cmd {} +
물론 필요한 경우 -o -type 연산자를 더 추가할 수 있습니다.
답변3
"*.mpg"
현재 디렉토리에 와일드카드와 일치하고 find
와 같이 혼란스러운 것으로 확장되는 파일이 있는 것 같습니다 . 큰따옴표 대신 작은 ... -o iname A Movie about Birds.mpg
따옴표를 사용하면 와일드카드 확장이 발생하지 않고 . '*.mpg'
"*.mpg"
find
*.mpg
무슨 일이 일어나고 있는지 보려면 시작 부분에 echo
( echo find ...
)를 추가하거나 결과를| tr "\000" "\n"