内容全体が "\n" であるすべてのファイルを再帰的に一覧表示する方法

内容全体が "\n" であるすべてのファイルを再帰的に一覧表示する方法

\n内容が正確に1つ(改行文字)の失敗した実験結果ファイルがあります。

ファイルが何であるかを理解して削除するために、すべてのファイルを一覧表示したいと思います(おそらくfind同様のものを使用して)。grep

答え1

.検索パスの外に参照ファイルを作成します(例にあります)。

echo >/tmp/reference

これで、探しているファイルと同じ既知のファイルがあります。次に、.検索パス(ここ)の下のすべての一般ファイルを参照ファイルと比較します。

find . -type f -size 1c -exec cmp -s -- /tmp/reference {} \; -print

-size 1c必須ではなく、省略することもできます。ただパフォーマンスを向上させるためのものです。これは、追加のプロセスを作成せずに間違ったサイズのファイルを拒否する迅速な予備テストです。cmp …比較的高価なプロセスは、適切なサイズのファイルに対してのみ生成されます。

-s沈黙cmpする。出力は必要なく、終了状態のみが必要です。

--説明は次のとおりです。"--"(二重ダッシュ) とはどういう意味ですか?この例では実際には必要ありません。つまり、参照ファイルがとして指定され、検索パスがある/tmp/reference場合は、誤って誤った動作や失敗を引き起こす可能性があるパスを選択する.のを防ぐために、誰かが使用します--cmp--

-execテストとして使用すると、テストされたファイルの終了ステータスが0の場合にのみ成功しますcmp。ファイルが一致すると、参照ファイルと同じファイルのパス名が提供されます/tmp/referencefind

この方法は、固定コンテンツを含むファイルを見つけるために使用できます。正確なコンテンツを含む参照ファイルだけが必要です(-size …使用する場合は調整することを忘れないでください。-size "$(</tmp/reference wc -c)c"便利です)。私たちの特別なケースでは、echo単純な方法を使用して正確に必要な改行文字を印刷するので、ファイルを生成します。

find一致するすべてのファイルを削除するには、次を使用します。-delete(XOR -exec rm -- {} +後ろに-print

答え2

シングルバイトファイルを検索します。既知の値と比較します。一致する場合は、印刷および/または削除

find /path/to/files -type f -size 1c -exec sh -c 'printf "\n" | cmp -s -- - "$1"' _  {} \; -print

自動的に実行するには、[-delete削除に追加]を選択してから[削除]を選択します。-print

答え3

GNUを使用すると、ファイル全体を1行として扱うgrepことができます(NULを行終端として使用して、ファイルに実際にNULが含まれていない限り、ファイル全体を1行として処理する効果があります)。これをファイル名だけを印刷してPCREで使用するものと組み合わせると、他のものは何もせずに1つだけを使用して「行」を検索できます。-z-zgrep\0-l-P\n\n

grep -lPz '^\n$' *

たとえば、次の3つのファイルがあるとします。

printf 'foo\n' > good_file_1
printf '\n\n\n\n' > good_file_2
printf '\n' > bad_file

grep上記を実行すると、次のようになります。

$ grep -lPz '^\n$' *
bad_file

globstarbashオプション(man)を使用して再帰的に作成することもできますbash

グローバルスター

設定されている場合、パス名拡張コンテキスト**で使用されるパターンは、すべてのファイルとゼロ以上のディレクトリとサブディレクトリと一致します。パターンの後に/が続くと、ディレクトリとサブディレクトリのみが一致します。

たとえば、この場合:

$ mkdir -p ./some/long/path/here/
$ cp bad_file some/long/path/here/bad_file_2
$ tree
.
├── bad_file
├── good_file_1
├── good_file_2
└── some
    └── long
        └── path
            └── here
                └── bad_file_2

5 directories, 4 files

有効にglobstarして実行すると、2つの誤ったファイルが見つかりますgrep**/*grepが検索するファイルではなく、指定されたディレクトリに文句を言ったため、標準エラーをリダイレクトしています。これらのエラーは予想され、安全に無視できます)。

$ grep -lPz '^\n$' **/* 2>/dev/null 
bad_file
some/long/path/here/bad_file_2

またはfindファイルを検索するには:

$ find . -type f -exec grep -lPz '^\n$' {} +
./some/long/path/here/bad_file_2
./bad_file

答え4

find . -size 1c -exec sh -c '[ -z "$(< $1)" ]' sh '{}' ';' -print

シェルからファイルを読み取ると、空のファイルが生成される正確に1バイトのサイズのファイルが見つかります。 sh は、コマンド置換から末尾の改行文字を削除します。

関連情報