我正在使用grep
它来搜索 1 TB 的文件。我想 grep 文件名并将名称放在文本文件中,我希望cp
所有文件都与 dir 匹配/home/user/matches
。我想在不使用 grep 搜索我的所有文件的情况下完成这两项任务。
我有想法用 grep 将文件名输出到一个文本文件中
grep -ril "xxx" . >> /home/user/matches/output-filename.txt
现在output-filename.txt
用作 cp 的输入并使 cp 每行执行一行。我怎么做?哇?或者你们有其他想法来避免两次搜索所有文件
文件路径是除 0 以外的字节序列;它们不一定是文本,更不用说文本行了。特别是文件路径
GNU 实现
grep
(添加-r
选项的那个)可以以非文本格式打印路径,并且可以-Z
安全地进行后处理。例如,GNUxargs
可以使用其-0
选项处理该格式:(这里也假设 GNU
cp
为它的-t
选项)如果您想使用 GNU 以人类可以理解的文本¹格式打印该列表
printf
:¹好吧,它应该确保无法解码为字符的字节被呈现为
$'\234'
表示形式。包括换行符在内的控制字符也是如此,它呈现为$'\n'
. 这解决了上面的前两点,但它不能保证输出的行将短于LINE_MAX
(但话又说回来,标准文本实用程序的 GNU 实现通常不限制它们支持的行的长度)。您可以使用
find
一对链式exec
命令。也许不是最有效的解决方案,因为它会grep
为每个文件(以及cp
每个匹配的文件)调用,但无论文件名中的字符如何,它都会起作用:像这样使用
tee
,xargs
命令(NULL byte \0
用作文件名分隔符的结尾)和GNU grep
:处理带有空格、换行符等的文件名...