客観的:
フォルダとすべてのサブフォルダで、最初の 4 バイトが 16 進シーケンス 00 00 FF FF で始まるファイル (例: *.dat) を検索し、ファイルを削除するたびに確認メッセージを表示せずに一致するすべてのファイルを削除します。
例えば:
Linuxではgrep + find + hexdump + rmの組み合わせを考えていました
例えば:
rm -r 一致したファイルを再帰的に削除する
hexdump -n4 *.dat はファイルの最初の4バイトを抽出します。
grep '\x00\x00\xFF\xFF' *.dat を実行して、返された 16 進ダンプ 00 00 FF FF に一致するファイルを検索します。
--重要-- 最初の 4 バイトにのみ 16 進数の 00 00 FF FF があるかどうかを確認してください。
ファイルの他の場所に 00 00 FF FF があるかどうかは関係ありません。(最初の 4 バイトのみをチェックする必要があります)
また、現在のフォルダとそのサブフォルダ内のすべての*.datファイルをスキャンする必要があることに注意してください。
そして00 00 FF FFはまさにこの順序でなければなりません
Windows でこれが可能であれば、最適なソリューションです (サードパーティのユーティリティの使用が必要な場合でも)。ただし、Linux で実行できるソリューションがあればうれしいです。
次のコマンドを試しましたが、何も返されませんでした。0000FFFFで始まる*.datファイルがあることは確かです。
rm -r | grep '\x00\x00\xFF\xFF' | hexdump -n4 *.dat
必要なコマンドをすべてパイプする方法がわかりません。
それを実行する方法について何かアイデアはありますか?
前もって感謝します!
答え1
このようなもの:
find . -type f -exec bash -c 'hexdump -n4 $1 | grep -q "^0000000 0000 ffff"' Anything {} \; -delete;
スローモーション:
find . -type f
現在のディレクトリの下にあるすべてのプレーンファイルを検索します- これらの各ファイルに対して、
hexdump -n4 $1 | grep -q "^0000000 0000 ffff"
ファイルが次の文字で始まる場合は0を返す1行のbashコマンドを実行します。00 00 FF FF
find
で開始されたコマンドが-exec
rc=0 を返さない場合は次のファイルにスキップし、それ以外の場合はそのファイルに対するフィルターまたはアクションの実行を続行します。次のフィルターまたはアクションは、-delete
前のフィルターが失敗しなかった場合にのみ実行されます。
これを使用すると、ファイルを削除せずに、代わりにファイルの名前を表示する手法を試すことができます。
find . -type f -exec bash -c 'hexdump -n4 $1 | grep -q "^0000000 0000 ffff"' Anything {} \; -exec printf "Would delete: %s\n" {} \;