我想复制在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
答案 0 :(得分:0)
效率不及cp -t
,但这有效:
grep -lr "foo" --include=*.txt * 2>/dev/null |
xargs -I{} cp "{}" /path/to/targetdir
说明:
对于filenames | xargs cp -t destination
,xargs
将传入的文件名更改为以下格式:
cp -t destination filename1 ... filenameN
即,它仅运行cp
一次(实际上,每数千个文件名运行一次-xargs
如果shell太长,则会中断命令行)。
另一方面,对于filenames | xargs -I{} cp "{}" destination
,xargs
将传入的文件名更改为以下格式:
cp "filename1" destination
...
cp "filenameN" destination
,即,它为每个传入的文件名运行cp
一次,这要慢得多。对于大量(例如> 10k)很小的文件(例如<10k),我猜它甚至可能慢数千倍。但这确实有效:)
PS:另一种流行的技术是使用find
的{{1}}函数代替exec
,例如https://stackoverflow.com/a/5241677/1563960