如何将 grep 的输出通过管道传输到 cp?

How to pipe output from grep to cp?

我有一个有效的 grep 命令可以选择满足特定条件的文件。如何从 grep 命令中获取选定的文件并将其通过管道传输到 cp 命令中?

以下尝试在 cp 端失败:

grep -r "TWL" --exclude=*.csv* | cp ~/data/lidar/tmp-ajp2/

cp: missing destination file operand after ‘/home/ubuntu/data/lidar/tmp-ajp2/’ Try 'cp --help' for more information.


cp `grep -r "TWL" --exclude=*.csv*` ~/data/lidar/tmp-ajp2/

cp: invalid option -- '7'

你需要 xargsplaceholder 选项:

grep -r "TWL" --exclude=*.csv* | xargs -I '{}' cp '{}' ~/data/lidar/tmp-ajp2/

通常如果你使用xargs,它会将输出放在命令之后,带有占位符(在这种情况下为'{}'),你可以选择插入的位置,甚至多次

grep -l -r "TWL" --exclude=*.csv* | xargs cp -t ~/data/lidar/tmp-ajp2/

解释:

  • grep -l 仅输出文件名的选项
  • xargs 将文件列表从标准输入转换为命令行参数
  • cp -t 指定目标目录的选项(并避免使用占位符)

要将文件复制到 grep 找到的目录,请使用 -printf 输出目录并使用 -i 放置来自 xarg 的命令参数(在管道之后)

find ./ -name 'filename.*' -print '%h\n' | xargs -i cp copyFile.txt {}

这会将 copyFile.txt 复制到包含 "filename"

的所有目录(在 ./ 中)

grep -rl '/目录/' -e 'pattern' | xargs cp -t /目录

在搜索具有特定日期的文件时,这对我有用:

 ls | grep '2018-08-22' | xargs -I '{}' cp '{}' ~/data/lidar/tmp-ajp2/