リストファイルにスペースを含むファイル名を「grep」にパイプする方法は?

リストファイルにスペースを含むファイル名を「grep」にパイプする方法は?

まず、私はcygwinを使用しているという事実はここで非常に関連性が高いと思います。

理論的には、私はこれを行う方法をすでに知っています。

cat file | xargs grep pattern

問題は、一部のファイルパスfileにスペースがあることです。ファイルは次のようになります。

subdir/foo/bar.html
subdir/f o o/ba r.html
subdir/~foo/bar.html

これによりエラーが発生します。この問題を解決する方法を読んだ。 use 。しかし、出力をnullで終わる行にxargs -0する方法がわからないので、ファイル全体を1行に圧縮するという意味だと思いました。catその結果、次のエラーが発生します。

xargs: argument line too long

修正する:私が読んでいたファイルにはもう存在しないいくつかのパスがあることがわかりました。偶然にも、これらの道はすべて一つずつあり、~これが問題だと思います。この文書は存在しないことがわかりました。それでも宇宙に関するすべてが残っています。

ベストアンサー1

xargs -d '\n'入力ファイルに1行に1つのファイル名が含まれている場合に使用されます。例えば

xargs -d '\n' grep pattern < file

ファイル名が「マイホームディレクトリ」で始まる場合は、まずこのシンボルを実際のホームディレクトリに変更する必要があり~ます。~たとえば、

sed -e "s=^~=$HOME=" file | xargs -d '\n' grep pattern

このsedスクリプトは二重引用符で囲まれています。考える変数を$HOMEsedスクリプトに挿入し、/ sが含まれているため、これを演算子の区切り文字として使用します(=しかしそうである可能性は低い)。s$HOME=

またはを使用している場合は、xargsオプションと一緒にfindfindオプションを使用してください。例えば-print0-0

find ... -print0 | xargs -0 grep pattern

または単にfind-execオプションを使用してください:

find ... -exec grep pattern {} +

おすすめ記事