作为大学课程的一部分,我尝试在 500 个文件的列表中秘密搜索字符串,然后将找到的项目复制到新文件夹中。
我可以使用以下方法轻松找到文件
grep -rnw '/home/steve/Desktop.CEDFOR.arnold-j/sent/' -e '[email protected]'
但是,当我尝试将结果传输到名为 Suspicious 的文件夹时,出现错误。
我使用的完整代码(基于几年前报告的类似问题)是
grep -rnw '/home/steve/Desktop.CEDFOR.arnold-j/sent/' -e '[email protected]' | xargs -0 cp -t /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/
但是,错误表明不存在这样的文件夹或文件。我可以确认文件夹 /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/ 确实存在。
为了澄清起见...我想将文件复制到“可疑”文件夹中,以便稍后进行查看。
我哪里做错了?
答案1
你grep
应该与众不同,它需要:
-l, --files-with-matches
,仅打印文件名称,不打印匹配的行-Z, --null
,由于您xargs
读取了零分隔输出-0
,这是一个好主意,您还需要提供以零分隔的输出添加-Z
到您的grep
命令中。-F, --fixed-strings
,因为你有一个固定字符串而不是模式,所以你应该使用-F
。如果不是,你的“模式”也会匹配vladimirXgorny@enron+com
,例如,这.
意味着任意字符在正则表达式中。也会-F
快很多!
它不需要:
-n
打印匹配的行号,但是如何xargs
处理它呢?
应该改为:
尽管它可以工作,但是你的命令应该改为与概要的格式相匹配,这样你就可以确保它
grep
也能与不同版本的 一起工作。(比较man grep
)。grep [OPTION...] -e PATTERNS ... [FILE...]
这意味着您的文件(或在您的情况下是路径)应该放在之后
-e ...
。
因此,您的完整命令如下:
grep -rlZFw -e '[email protected]' '/home/steve/Desktop/CEDFOR/arnold-j/sent/'
或者你可以省略-e
以匹配第一个 SYNOPSIS 形式:
grep -rlZFw '[email protected]' '/home/steve/Desktop/CEDFOR/arnold-j/sent/'
在我看来你的xargs
文件看起来不错,但是你应该考虑添加,-r, --no-run-if-empty
以避免在grep
找不到任何匹配文件时出现错误。
对于你的cp
命令,最好习惯于附加--
说明cp
没有以下选项。否则,以 开头的文件名-
可能会引起麻烦。
xargs -0r cp -t /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/ --
总共:
grep -rlZFw '[email protected]' '/home/steve/Desktop/CEDFOR/arnold-j/sent/' \
| xargs -0r cp -t /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/ --