Shell

如何將帶有空格的文件名從列表文件傳送到“grep”?

  • July 21, 2021

首先,我認為我使用 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 {} +

引用自:https://unix.stackexchange.com/questions/658964