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)