作为大学课程的一部分,我试图在 500 个文件的列表中隐蔽地搜索一个字符串,然后将找到的这些项目复制到一个新文件夹中。
我可以毫无问题地找到文件
grep -rnw '/home/steve/Desktop.CEDFOR.arnold-j/sent/' -e 'vladimir.gorny@enron.com'
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将结果通过管道传送到名为 Suspicious 的文件夹时,它会出错。
我正在使用的完整代码(基于几年前报告的类似问题)是
grep -rnw '/home/steve/Desktop.CEDFOR.arnold-j/sent/' -e 'vladimir.gorny@enron.com' | xargs -0 cp -t /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/
Run Code Online (Sandbox Code Playgroud)
但是,错误指出不存在此类文件夹或文件。我可以确认文件夹 /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/ 肯定存在。
澄清...我想将文件复制到“可疑”文件夹中,以便稍后查看。
我哪里错了?
你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 'vladimir.gorny@enron.com' '/home/steve/Desktop/CEDFOR/arnold-j/sent/'
Run Code Online (Sandbox Code Playgroud)
或者您可以省略-e以匹配第一个 SYNOPSIS 表单:
grep -rlZFw 'vladimir.gorny@enron.com' '/home/steve/Desktop/CEDFOR/arnold-j/sent/'
Run Code Online (Sandbox Code Playgroud)
您xargs对我来说看起来不错,但是-r, --no-run-if-empty当grep找不到任何匹配的文件时,您应该考虑添加以避免错误。
而对于你的cp命令,这是很好的习惯,追加--告诉cp说没有选项以下。否则,以 开头的文件名-可能会导致麻烦。
xargs -0r cp -t /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/ --
Run Code Online (Sandbox Code Playgroud)
总共:
grep -rlZFw 'vladimir.gorny@enron.com' '/home/steve/Desktop/CEDFOR/arnold-j/sent/' \
| xargs -0r cp -t /home/steve/Desktop/CEDFOR/arnold-j/Suspicious/ --
Run Code Online (Sandbox Code Playgroud)