需要将使用 grep 找到的文件移动到文件夹中

Ste*_*eve 2 grep xargs

作为大学课程的一部分,我试图在 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/ 肯定存在。

澄清...我想将文件复制到“可疑”文件夹中,以便稍后查看。

我哪里错了?

pLu*_*umo 5

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-emptygrep找不到任何匹配的文件时,您应该考虑添加以避免错误。

而对于你的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)