MIMEタイプに応じてファイルを削除する方法は?

MIMEタイプに応じてファイルを削除する方法は?

(こんにちは皆さん!ここに初めて文を載せるので、皆さんに特に挨拶します。)

.webpや.pngイメージなどのフォルダやサブフォルダのMIMEタイプに基づいてファイルを削除するコマンドを使用したいと思います。私のコンピューティングの知識はほぼゼロですが、拡張機能に基づいて削除しました。

まず、目的のフォルダに移動します。

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ではなくエンコードされたテキストへのファイルパスを処理するのが難しいと思われるため、任意のファイルパスが処理されない可能性があります。

関連情報