MIME 유형에 따라 파일을 삭제하는 방법은 무엇입니까?

MIME 유형에 따라 파일을 삭제하는 방법은 무엇입니까?

(안녕하세요 여러분! 이곳에 처음으로 글을 올리기 때문에 여러분께 특별히 인사드립니다.)

.webp 및 .png 이미지와 같은 폴더 및 하위 폴더의 MIME 유형을 기반으로 파일을 삭제하는 명령을 사용하고 싶습니다. 내 컴퓨팅 지식은 거의 0이지만 확장 기능을 기반으로 제거했습니다.

먼저 원하는 폴더로 이동합니다.

cd /my-folder

그 다음에:

find \( -iname "*.webp" -o -iname "*.png" \) -print0 | xargs -0 rm -f

누군가 이미 다른 포럼에서 답변을 줬고 명령은 작동하지만 70개 파일에 대해 10초 정도 느려서 사용할 수 없습니다.

while read -d '' Fichier
do
  MimeType=$(mimetype --output-format %m "$Fichier") 
  [[ "${MimeType}" == @(image/webp|image/png) ]] && echo rm "$Fichier"
done < <(find . -type f -print0)

이건 정말 "쉬운" 작업인 것 같습니다...

답변1

exiftool특정 MIME 유형으로 식별된 파일을 보고하는 데 사용할 수 있습니다.

exiftool -q -r. -ext '*' -if '
  print "$FilePath\0" if $MIMEType =~ m{^image/(webp|jpeg)$}; 0' . |
  xargs -r0 echo rm

( echo올바르게 보이면 삭제)

  • -q: 조용한
  • -r.:재귀 검색(숨겨진 디렉토리 포함)(디렉토리에 대한 심볼릭 링크를 따릅니다!)
  • -ext '*':알려진 확장자를 가진 파일을 제한하지 마세요.
  • -if 'perl code': 코드가 true를 반환하는 파일에 대한 정보만 보고합니다. 여기서는 ;0NUL로 구분된 파일 경로를 인쇄하려고 하고 print코드를 호출하여 이를 수행하므로 파일이 선택되지 않도록 return false를 추가합니다. 이렇게 하면 -if '$MIMEType eq "image/webp"' -s3 -FilePath줄바꿈으로 구분된 경로가 인쇄됩니다. 줄바꿈은 파일 경로의 모든 문자만큼 유효하기 때문에 안정적으로 사후 처리할 수 없습니다.

또는 exiftool파일 자체를 삭제할 수도 있습니다.

exiftool -q -r. -ext '*' -if '
  if ($MIMEType =~ m{^image/(webp|jpeg)$}) {
    print STDERR "Deleting $FilePath\n";
    unlink $FilePath or print STDERR "Failed: $!\n";
  }
  0' .

답변2

테스트를 병합할 수 있습니다.

find -type f \( -iname "*.webp" -o -iname "*.png" \) \
-exec bash -c 'grep image <<<"$(mimetype -b "$1")"' bash {} \; \
-delete

할 수 있는 작업:

  1. 행: 파일( )만 검색하고 또는로 type f끝나는 이름으로 필터링합니다 ..webp.png

  2. 행: bash 스크립트를 실행합니다. 여기서

    2.1. mimetype b "$1"매개변수 번호의 MIME 유형을 반환합니다. 1 스크립트에서만 가능합니다. -b다음 문자열 검색에 이름에 "image"가 포함된 파일도 포함되지 않도록 파일 이름 반환을 건너뜁니다.

    2.2. grep반환된 mimetype에서 "image" 문자열을 검색하려면 ;를 사용하세요. 문자열이 발견되면 grep성공합니다(종료 상태).0

    find2.3 명령 대체가 ; 에서는 제대로 작동하지 않기 때문에 이 모든 내용을 bash 스크립트에 포함해야 합니다. bash 매개변수 번호는 0` 로 시작됩니다.bash -c 'script' arg0 arg1 arg2 ...', hence the extra

  3. 행은 성공한 이전 명령의 모든 항목을 제거합니다. 대신 어떤 파일이 영향을 받는지 보여주는 테스트 실행을 -delete수행 할 수도 있습니다.-print

find | xargs rm그리고 귀하의 질문에 있는 - 조합에 대한 팁은 다음과 같습니다.

find자체 제거 도구가 있습니다.

find -name '*png' ....<other refinements> ... -delete

하지만 조심하고 -delete마지막에만 남겨두세요. 나는 이것을 오래 전에 어렵게 배웠습니다…

답변3

filemimetype아마도 ¹ 또는 exiftool작성한 것 보다 더 효율적일 것입니다 perl. 특히 많은 파일에 대해 한 번 호출하는 경우 다음을 수행할 수 있습니다.

find . -type f -exec file -00 --mime-type {} + |
  perl -0lne '$file = $_; chomp($type = <>);
              print $file if $type =~ m{^image/(webp|jpeg)\z}' |
  xargs -r0 echo rm

print $file대신 unlink $file해당 부분을 수행하고 건너뛸 수 있습니다 .| xargs rm

find . -type f -exec file -00 --mime-type {} + |
  perl -0lne '$file = $_; chomp($type = <>);
              if ($type =~ m{^image/(webp|jpeg)\z}) {
                warn "Deleting $file\n";
                unlink $file or warn "Failed: $!\n"
              }'

내 테스트에서는 mimetypeUTF-8이 아닌 인코딩된 텍스트에 대한 파일 경로를 처리하는 데 어려움이 있는 것으로 보이므로 임의의 파일 경로가 처리되지 않을 수 있습니다.

관련 정보