ファイルの特定のデータパターンに一致するZipファイル

ファイルの特定のデータパターンに一致するZipファイル

ファイルがいっぱいのディレクトリがあります*.CLM_01。ファイル内に値が「005010X222」のすべてのファイルを含む1つのzipファイルを作成したいと思います。デフォルトでは「005010X223」を含むファイルがありますが、zipから除外したいと思います。彼らは相互に排他的です。値はファイル名ではなくファイルのデータにあります。

これを試しましたが、まだすべてのファイルを1つのzipファイルに圧縮します。

for f in *.CLM_01; do zip -ur test.zip $f | grep "005010X222" $f ; done

ベストアンサー1

zshGNUと互換性があるかgrep

zip file.zip ${(0)"$(grep -l --null 005010X222 ./*.CLM_01)"}

grepを使用しないが、すべての--nullファイル名に改行文字が含まれていないことを保証できる場合:

zip file.zip ${(f)"$(grep -l 005010X222 ./*.CLM_01)"}

他のPOSIX様シェルの場合は、Split + glob演算子を使用して同じことを実行できます。

IFS='
' # split on newline
set -o noglob # disable glob
zip file.zip $(grep -l 005010X222 ./*.CLM_01)

その場合は、次のようにbsdtar標準入力にヌルで区切られたファイルのリストを渡すこともできます--null -T -

grep -l --null 005010X222 ./*.CLM_01 | bsdtar --null -T - -acf file.zip

GNUの実装では、次のように独自に再帰的にgrepファイルを見つけることもできます。*.CLM_01

grep --include='*.CLM_01' -rl --null 005010X222 . |
  bsdtar --null -T - -acf file.zip

grepこのソリューションは、ファイルパスがorに引数として渡されないため、コマンドに渡される引数の数の制限の影響を受けません。bsdtarただし、上記のglobベースのソリューションとは異なり、隠しファイルも考慮することに注意してください。

GNUの場合は、以下を実行するファイルのリストも参照grepしてください。grep -L 005010X223いいえ005010X222を含むエントリを一覧表示するのではなく、005010X223を含めますgrep -l 005010X222

おすすめ記事