0

ディレクトリに多くのtxtファイル(> 100)があります。ファイルに特定のテキストを含むすべてのファイルを圧縮したい。私は試していた

for z in `grep -lr "some-string" .`
do 
  zip -g upload.zip $z; 
done

ただし、ファイル名にスペースが含まれているため、エラーが発生します。これを達成する方法は?

4

2 に答える 2

8

ファイル名に含まれるスペース、改行、およびその他の奇妙な文字を処理する最も安全な方法は、ファイル-Z名を区切るために、ファイル名の間にゼロ バイトを出力するオプションを使用することです。その後、 を使用xargsしてファイルを に渡すことができますzip

grep -lrZ "some-string" . | xargs -0 zip -g upload.zip
于 2012-12-14T09:08:46.643 に答える
2

絶対に書かない

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 の周りに引用符を追加しました。すべての結果 (スペースやグロビング文字を含むファイル名での失敗を含む) を完全に理解しない明確な理由がない限り、常にシェル変数を引用符で囲んでください。

于 2012-12-14T16:00:44.337 に答える