나는 잘못된 이미지를 찾기 위해 이 작은 스크립트를 사용하고 있습니다.
find -name '*.jpg' -exec identify -format "%f\n" {} \; 2>errors.txt
훌륭하게 작동하지만 이제 약간 수정해야 합니다. stderr을 error.txt에 덤프하는 것이 아니라 오류를 발생시킨 이미지의 파일 이름(%f)을 덤프하고 싶습니다. 즉, 오류 메시지 목록이 아닌 error.txt에 잘못된 형식의 이미지 파일 목록이 필요합니다.
-exec 섹션에 || echo "%f" >>Errors.txt를 추가하려고 시도했지만 작동하지 않았습니다. 가장 좋은 접근 방식은 무엇입니까?
답변1
잘못된 형식의 이미지를 찾아 해당 이름을 다음 위치에 저장합니다 names.txt
.
find -name '*.jpg' -exec bash -c 'identify "$1" &>/dev/null || echo "$1">>names.txt' none {} \;
어떻게 작동하나요?
find -name '*.jpg'
평소대로 시작됩니다
find
.-exec bash -c 'identify "$1" &>/dev/null || echo "$1" >>names.txt' none {} \;
이는
identify
각 파일에서 실행되며identify
0이 아닌 오류 코드가 반환되면 파일 이름을names.txt
.bash -c '...' none {}
bash 쉘이 명령을 따옴표로 묶고{}
위치 인수에 파일 이름을 할당하도록 합니다$1
.호기심에 문자열
none
이 에 할당되었습니다$0
.$0
미사용~하지 않는 한이 경우 bash는 오류를 생성합니다오류 메시지에 프로그램 이름으로 표시됩니다..
논의하다
|| echo "%f" >> errors.txt
-exec 부분에 추가를 시도했지만 작동하지 않습니다. 가장 좋은 접근 방식은 무엇입니까?
||
미묘한 점은 명령에 따라 행동 해야 한다는 데 있습니다 identify
. 이를 수행하려면 위에 표시된 방법을 identify
사용하여 쉘 에 넣어야 합니다 .bash -c
답변2
find . -name '*.jpg' -exec sh -c '
for file do
if identify "$file"; then
printf "%s\n" "$file" >&3
else
printf "%s\n" "$file" >&4
fi
done' sh {} + 3> good 4> bad > /dev/null 2>&1
답변3
그래서 당신은 다음과 같은 것을 원합니다 ...
find . -name '*.jpg' \
! -exec identify -silent {} \; \
-print 2>/dev/null >errors.txt