如何将 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'
你需要 xargs 和 placeholder 选项:
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/
我有一个有效的 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'
你需要 xargs 和 placeholder 选项:
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/