Shell
如何將帶有空格的文件名從列表文件傳送到“grep”?
首先,我認為我使用 cygwin 的事實與此高度相關。
理論上,我已經知道如何做到這一點:
cat file | xargs grep pattern
問題是,其中的一些文件路徑
file
有空格。該文件如下所示:subdir/foo/bar.html subdir/f o o/ba r.html subdir/~foo/bar.html
這會導致錯誤。我閱讀瞭如何解決這個問題:使用
xargs -0
. 但我不知道如何使cat
輸出以空結尾的行結尾,所以我認為這意味著它將整個文件壓縮成一行。結果,它給出了這個錯誤:xargs: argument line too long
**更新:**原來我正在讀取的文件有一些不再存在的路徑。巧合的是,所有這些路徑都有一個
~
,所以我錯誤地認為這是一個問題。儘管如此,關於空間的一切仍然存在。原來這些文件根本不存在。
xargs -d '\n'
如果輸入文件每行包含一個文件名,則使用。例如xargs -d '\n' grep pattern < file
如果您的文件名
~
以“我的主目錄”開頭,您首先需要將這些~
符號替換為您的實際主目錄。例如:sed -e "s=^~=$HOME=" file | xargs -d '\n' grep pattern
請注意,這個 sed 腳本是雙引號的,因為我們想將變數
$HOME
插入到 sed 腳本中,並=
用作運算符的分隔符,s
因為$HOME
它將包含 /s(但不太可能包含=
)。或者,如果您使用的是
find
,請結合使用 find 的-print0
選項和 xargs 的-0
選項。例如find ... -print0 | xargs -0 grep pattern
或者只使用 find 的
-exec
選項:find ... -exec grep pattern {} +