100% NULL を含むファイルを検索する方法が見つかりませんか?

100% NULL を含むファイルを検索する方法が見つかりませんか?

デスクトップ フォルダがなくなってしまいました (そこにはたくさんのものがありました。おそらく 1000 個のファイル)。そして、削除されたファイルをすぐに回復するツールを使用しました。削除されたファイルをすべて見つけて回復しました。日付やサイズなど、すべて正常に見えました。そこで、それらをデスクトップ フォルダにコピーし直したところ、すべてのファイルが 100% NUL であることがわかりました。改行も入っていないと思います。null の長い文字列が 1 つあるだけです。ファイルのサイズは正しいのですが。

幸運なことに、1.5 か月前の古いバックアップがあったので、ファイルの約 80% を復元することができました。

しかし、今ではデスクトップ全体とデスクトップ上のフォルダーに NULL がいっぱいのファイルが 20% あります。

私は Python を知らないので、これらのファイルを識別するツールを見つけることができません。100% NUL 00 文字でいっぱいのファイルを見つけることができるツールが誰も作っていないというのは、私には奇妙に思えます。私は現在 61 歳で退職していますが、以前はソフトウェア開発者だったので、これを行うためだけに言語を学びたくはありません。これは、誰かがツールを作って共有するチャンスのように思えます。私は Regex 検索を使用して grepWin を試し、あちこち検索しましたが、同じことをしようとして失敗している人がたくさんいることがわかりました。

テスト用のサンプル NUL ファイルがいくつかあります。ここにアップロードする方法がわかりません。

答え1

ありがとう、ポール。何らかの理由で、あなたの回答にコメントできません。コメントするには「50 の評価が必要」と書かれています。私の質問が Unix フォーラムから移行されたからでしょうか? わかりません。

あなたの返信は grep コマンドですか? もしそうなら、これに関する基本的な指示も必要です。検索に検索を重ね、grepWin を試してみましたが (100% null ファイルを見つけることができません)、grep3.4 をダウンロードしました (ただし、コマンドが機能しません。システム パスの設定が必要かもしれません。わかりません)、GnuWin を見つけました (これは 32 ビット システム専用で、Win 10 64 を使用しているため、必要なものではないと思います)... 初心者向けのチュートリアルも検索しましたが、Grep を動作させるための設定方法を示すものはありませんでした。すべて、基本的なコマンドの説明から始まります...

再度、ご返信ありがとうございます。ご迷惑をおかけして申し訳ありません。5日間ほどこの問題を解決しようとしていますが、この時点でかなりバカバカしく感じていますので、どんな助けでも大歓迎です。

答え2

遅くなって申し訳ありません。ゲストとしてコメントしたため、回答の通知が届きませんでした。

これはテスト済みのスクリプトですが、少し調整が必要になる可能性があります。

#! /bin/bash

    find 2>/dev/null . -type f -size +0c | while IFS= read -r fn; do
        NN="$( head --bytes=128 "${fn}" | tr -d '\0' | wc -c )"
        (( NN > 0 )) && continue

        NN="$( tr -d '\0' < "${fn}" | wc -c )"
        (( NN > 0 )) && continue

        printf "rm -f '%s'\n" "${fn}"
    done

書かれているとおり、ディレクトリ ツリー内の NUL 文字だけで構成されるすべてのファイルを削除するコマンドのリストが作成されます。そのリストをファイルにリダイレクトして確認し、 と入力するだけです。または、 done の直後にbash < myRmFile置くこともできます 。| bash

外側のループは、find ...; do ... done実行した場所からディレクトリを再帰的に検索します。 find のオプションは、サイズが少なくとも 1 バイトの通常のファイルのみを選択し、名前を 1 つずつ変数 fn に読み込みます。

次の 2 行は、すべてのファイル全体を読み込む手間を省くための事前チェック最適化です。適切なファイルには 128 バイトの NUL バイトとその後に何か他のものが含まれることはないため、最初の 128 バイトだけをチェックします。

そこで、3 つのコマンドのパイプラインから NN にカウントを割り当てます。 はhead最初の 128 バイトを取り出し、 はtrすべての NUL を削除し、 はwc -c残ったバイトをカウントします。NUL 以外のバイトが残っている場合は、次のファイル名に進みます。

次の 2 行は、"適切でない" ファイルを見つけた場合に備えて、ファイル全体に対して同じ処理を実行します。

これら両方のチェックに失敗したものは、そのファイルに対して rm 命令を生成します。

これは、ファイル名に一重引用符や改行が含まれているような極端なファイル名では少し不安定です。また、ファイルごとに rm プロセスが実行されますが、約 200 個しかないようなので、これは重要ではありません。

問題がある場合は再度投稿してください。

関連情報