ファイルがいっぱいのディレクトリがあります*.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
zsh
GNUと互換性があるか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
。
答え2
find
静かなテストで使用するgrep
:
find -name '*CLM_01' -exec grep -q '005010X222' {} \; -print0 | xargs -0 zip -u all_files.zip +
-q
inはgrep
静かなオプションで、一致する場合にのみ成功します(終了コード0)。
-u
複数の呼び出しが必要な場合にも最適ですzip
。xargs
zip