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

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

作为大学课程的一部分,我尝试在 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/ --

相关内容