커맨드 라인을 사용하여 특정 픽셀 크기의 모든 이미지를 찾는 방법은 무엇입니까?


16

너비 또는 높이가 300px 미만인 하위 폴더가있는 폴더에서 모든 JPG 이미지를 찾으려고합니다.

이렇게하면 오래된 축소판을 감지하고 삭제하려고합니다.

확실히 다음을 사용하여 모든 이미지를 찾을 수 있습니다 find.

find . -iname "*.jpg" -type f | ...

그러나 파이프 다음에 무엇을합니까? 사진의 속성을 감지하기 위해 어떤 패키지를 사용할 수 있습니까?

답변:


17

당신은 사용할 수 있습니다 identify에서 imagemagick, 다음과 같은 명령을 사용할 수 있습니다 :

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'

를 사용 -exec <command> '{}' \;하면 파일 이름에 공백이 있는지 확인하거나 대신 사용할 수 있습니다

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'

여기서이 -I{}같은 일을 담당한다.

내가 좋아하는 identify것은 출력 형식을 지정할 수 있다는 것입니다. 이 경우 '%w %h %i'이미지의 너비, 높이 및 전체 경로 이름을 제공합니다. 그런 다음 awk표현식은 이미지가 원하는 크기보다 작은 선만 유지합니다.

출력 예 :

64 64 ./thumbsup.jpg
100 150 ./photomin.jpg

편집 : 당신은 파일 이름 만 (에 배관하려는 경우 rm예를 들어), 간단하게 변경 $lineawk에 문 $3, 다음은 세 번째 열을 인쇄합니다.


3
awk 부분은 더 짧아 질 수 있습니다 : | awk '$1<300||$2<300'또는 | awk '$1<300||$2<300{print $3}'(3 번째 열만 필요할 때).
har-wradim

@ har-wradim 감사합니다, 좋은 제안!
Gerhard Burger

7
나는 '%w %h %i\n'그것을 위해 일하기 위해 개행 ( ) 을 추가해야했다 .
qwr

6 년짜리 질문에 대한 글을 썼지 만 죄송합니다. 이것은 Google에서 내 질문에 부분적으로 아는 유일한 결과입니다. 기본적으로 원하는 것은 특정 크기가 있거나 특정 이미지 내에서 이미지를 찾은 다음 다른 디렉토리에 복사하는 것입니다. cp는 복사하는 데 사용되지만이 명령을 cp와 통합하는 데 실패합니다.
GhostOrder

@GhostOrder는 @ har-wradim의 제안에 따라 3 번째 열만 인쇄 한 다음 이와 같은 다른 파이프를 추가합니다| xargs -I {} mv {} /destination/directory/
Gerhard Burger

1

나는 받아 들인 대답이 매우 좋다고 생각하지만 다른 가능한 해결책을 추가하고 싶었습니다 ...

내가 ImageMagick지금 가장 자주 도구를 사용하지만 netpbm이미지를 처리하는 오랜 친구입니다. 다음 명령으로 이미지 형식의 크기를 볼 수 있습니다.

anytopnm file | pamfile

다음과 같은 출력이 생성됩니다.

stdin:  PPM raw, 1650 by 1275  maxval 255

의 질문에 대답하기 위해 "파이프 후 다음 무엇을?", 내가 사용하는 while read더 자주 사용하는 것보다 xargs더 유연하기 때문이다. netpbm질문에 대한 나의 대답은 다음과 같습니다.

find -iname \*.jpg | while read img; do \
  anytopnm "$img" | pamfile | \
    perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || rm -v "$img"; \
done

1

이것은 나를 위해 일했다 :

find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'

이것은 출력 샘플입니다.

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75


0

패키지 의 identify명령은 imagemagick원하는 것을 수행합니다.

$ identify abc.jpg
abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000

다시 grep이미지 크기를 정렬하는 데 사용해야 합니다.

그러나 이미지 크기가 매우 넓지 않으면 find주어진 크기 이하의 JPEG 파일을 제거 하는 것이 더 쉬울 것입니다 .

find -iname '*.jpg' -size -10k -delete

( -delete먼저 확인 하지 않고 실행 하는 경우 유지하려는 항목을 찾지 못합니다. 그렇지 않으면 삭제하기 전에 프롬프트가 표시되지 않습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.