ディレクトリに多くのtxtファイル(> 100)があります。ファイルに特定のテキストを含むすべてのファイルを圧縮したい。私は試していた
for z in `grep -lr "some-string" .`
do
zip -g upload.zip $z;
done
ただし、ファイル名にスペースが含まれているため、エラーが発生します。これを達成する方法は?
ファイル名に含まれるスペース、改行、およびその他の奇妙な文字を処理する最も安全な方法は、ファイル-Z
名を区切るために、ファイル名の間にゼロ バイトを出力するオプションを使用することです。その後、 を使用xargs
してファイルを に渡すことができますzip
。
grep -lrZ "some-string" . | xargs -0 zip -g upload.zip
絶対に書かない
for file in <command>
スペースを含むファイル名では機能しないためです。コマンドから出力されたファイル名のリストをループする必要がある場合は、次のようにします。
<command> |
while IFS= read -r file
改行を含むファイル名ではまだ失敗しますが、それらはまれであり、改行を含まないように修正する必要があります。
したがって、代わりに:
for z in `grep -lr "some-string" .`
do
zip -g upload.zip $z;
done
あなたは書くでしょう:
grep -lr "some-string" . |
while IFS= read -r z
do
zip -g upload.zip "$z"
done
また、$z の周りに引用符を追加しました。すべての結果 (スペースやグロビング文字を含むファイル名での失敗を含む) を完全に理解しない明確な理由がない限り、常にシェル変数を引用符で囲んでください。