我有一些像
love.txt
loveyou.txt
Run Code Online (Sandbox Code Playgroud)
在目录中useful; 我想将此文件复制到目录/tmp.
我用这个命令:
find ./useful/ -name "love*" | xargs cp /tmp/
Run Code Online (Sandbox Code Playgroud)
但是不起作用,只是说:
cp: target `./useful/loveyou.txt' is not a directory
Run Code Online (Sandbox Code Playgroud)
当我使用此命令时:
find ./useful/ -name "love*" | xargs -i cp {} /tmp/
Run Code Online (Sandbox Code Playgroud)
它工作正常,
我想知道为什么第二个工作,更多关于使用-i cp {}.
cho*_*oba 21
xargs将来自标准输入的单词放入给定命令的参数列表的末尾.因此,第一种形式创造了
cp /tmp/ ./useful/love.txt ./useful/loveyou.txt
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,因为有两个以上的参数,最后一个不是目录.
该-i选项告诉xargs您一次处理一个文件,替换{}为其名称,因此它等同于
cp ./useful/love.txt /tmp/
cp ./useful/loveyou.txt /tmp/
Run Code Online (Sandbox Code Playgroud)
这显然效果很好.
Eri*_*oen 11
使用该xargs -i命令时,{}将替换为您找到的每个元素.因此,在您的情况下,对于"loveyou.txt"和"love.txt",将运行以下命令:
cp ./useful/loveyou.txt /tmp/
cp ./useful/love.txt /tmp/
Run Code Online (Sandbox Code Playgroud)
如果省略{},您找到的所有元素将自动插入命令的末尾,因此,您将执行无意义的命令:
cp /tmp/ ./useful/loveyou.txt ./useful/love.txt
Run Code Online (Sandbox Code Playgroud)