如何在OSX上复制使用grep找到的文件

时间:2018-11-12 19:12:08

标签: macos grep pipe xargs cp

我想复制在OSX系统上使用grep找到的文件,其中cp命令没有-t选项。

A previous posts' solution所做的操作依赖于-t中的cp标志。但是,像那位发帖人一样,我想获取从grep收到的文件列表,然后对其执行命令,例如:

grep -lr "foo" --include=*.txt * 2>/dev/null | xargs cp -t /path/to/targetdir

1 个答案:

答案 0 :(得分:0)

效率不及cp -t,但这有效:

grep -lr "foo" --include=*.txt * 2>/dev/null |
  xargs -I{} cp "{}" /path/to/targetdir

说明:

对于filenames | xargs cp -t destinationxargs将传入的文件名更改为以下格式:

cp -t destination filename1 ... filenameN

即,它仅运行cp一次(实际上,每数千个文件名运行一次-xargs如果shell太长,则会中断命令行)。

另一方面,对于filenames | xargs -I{} cp "{}" destinationxargs将传入的文件名更改为以下格式:

cp "filename1" destination
...
cp "filenameN" destination

,即,它为每个传入的文件名运行cp一次,这要慢得多。对于大量(例如> 10k)很小的文件(例如<10k),我猜它甚至可能慢数千倍。但这确实有效:)

PS:另一种流行的技术是使用find的{​​{1}}函数代替exec,例如https://stackoverflow.com/a/5241677/1563960