(こんにちは皆さん!ここに初めて文を載せるので、皆さんに特に挨拶します。)
.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を返すファイルに関する情報のみを報告します。ここでは、;0
NULで区切られたファイルパスを印刷しようとして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
できること:
行:ファイル()のみを検索し、またはで
type f
終わる名前でフィルタリングします。.webp
.png
行:bashスクリプトを実行します。ここで
2.1。
mimetype b "$1"
パラメータ番号のMIMEタイプを返します。 1スクリプトでのみ可能です。-b
次の文字列検索に名前に "image"を含むファイルも含まれないように、ファイル名の返却をスキップします。2.2.
grep
返されたmimetypeから文字列 "image"を検索するには;を使用してください。文字列が見つかるとgrep
成功します(終了ステータス)。0
find
2.3命令置換ではうまく機能しないため、これらのすべてをbashスクリプトに含める必要があります。 bashパラメータ番号は0
`で始まります。bash -c 'script' arg0 arg1 arg2 ...', hence the extra
行は、成功した前のコマンドのすべてのエントリを削除します。代わりに、どのファイルが影響を受けるかを示すテスト実行を
-delete
実行することもできます。-print
find | xargs rm
そしてあなたの質問で - 組み合わせのヒントは次のとおりです。
find
自己除去ツールがあります。
find -name '*png' ....<other refinements> ... -delete
しかし、注意して-delete
最後に残してください。私はこれをずっと前に難しく学びました…
答え3
file
mimetype
おそらく¹または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"
}'
私のテストでは、mimetype
UTF-8ではなくエンコードされたテキストへのファイルパスを処理するのが難しいと思われるため、任意のファイルパスが処理されない可能性があります。