如何将带有空格的文件名从列表文件传输到“grep”?

Dan*_*lan 7 shell cygwin text-processing filenames

首先,我认为我使用 cygwin 的事实在这里非常相关。

理论上,我已经知道如何做到这一点:

cat file | xargs grep pattern
Run Code Online (Sandbox Code Playgroud)

问题是,其中的一些文件路径file有空格。该文件如下所示:

subdir/foo/bar.html
subdir/f o o/ba r.html
subdir/~foo/bar.html
Run Code Online (Sandbox Code Playgroud)

这会导致错误。我阅读了如何解决这个问题:使用xargs -0. 但我不知道如何使cat输出以空结尾的行结尾,所以我认为这意味着它将整个文件压缩成一行。结果,它给出了这个错误:

xargs: argument line too long
Run Code Online (Sandbox Code Playgroud)

更新:原来我正在读取的文件有一些不再存在的路径。巧的是,所有这些路径中都有一个~,所以我错误地认为这是一个问题。尽管如此,关于空间的一切仍然存在。原来这些文件根本不存在。

cas*_*cas 13

xargs -d '\n'如果输入文件每行包含一个文件名,请使用。例如

xargs -d '\n' grep pattern < file
Run Code Online (Sandbox Code Playgroud)

如果您的文件名~以指示“我的主目录”开头,则首先需要将这些~符号替换为您的实际主目录。例如:

sed -e "s=^~=$HOME=" file | xargs -d '\n' grep pattern
Run Code Online (Sandbox Code Playgroud)

请注意,这个 sed 脚本是双引号的,因为我们将变量$HOME插入到 sed 脚本中,并=用作s运算符的分隔符,因为$HOME将包含 /s(但不太可能包含=)。

或者,如果您正在使用find,请-print0结合使用 find 的选项和 xargs 的-0选项。例如

find ... -print0 | xargs -0 grep pattern
Run Code Online (Sandbox Code Playgroud)

或者只是使用 find 的-exec选项:

find ... -exec grep pattern {} +
Run Code Online (Sandbox Code Playgroud)