\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/reference
。find
この方法は、固定コンテンツを含むファイルを見つけるために使用できます。正確なコンテンツを含む参照ファイルだけが必要です(-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
-z
grep
\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
globstar
bashオプション(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 は、コマンド置換から末尾の改行文字を削除します。