如何使用gnu cp命令将文件复制到多个目录

Tom*_*ner 201 linux bash shell

是否可以使用cp命令将单个文件复制到多个目录?

我尝试了以下,但没有用:

cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}
Run Code Online (Sandbox Code Playgroud)

我知道可以使用for循环,或者找到.但是可以使用gnu cp命令吗?

Rob*_*ble 572

你不能做到这一点cp孤单,但你可以结合cp使用xargs:

echo dir1 dir2 dir3 | xargs -n 1 cp file1
Run Code Online (Sandbox Code Playgroud)

将复制file1dir1,dir2dir3. xargs将调用cp3次来执行此操作,xargs有关详细信息,请参见手册页.

  • 根据他们是否在技术上回答问题来确定答案是否接受将是不可能的迂腐并且不是真正有用的. (25认同)
  • @Simon怎么样?"你不能单独使用`cp`来做到这一点"只是因为通过建议另一种方式试图提供帮助并不意味着问题没有得到解答. (23认同)
  • 很有帮助!对于像我这样的其他初学者:你不能在cp中使用正则表达式,但你可以在这个命令的第一部分(例如`echo dir [1-3] | xargs -n 1 cp filename`). (4认同)
  • 有关xargs的更多信息:http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/ (3认同)
  • @NickC提问者指出:"我知道可以使用for循环,或者查找.但是可以使用gnu cp命令吗?" 好的答案是接受的答案. (3认同)
  • 我发现一个简单的通配符工作正常,可以复制到当前级别的所有目录,例如`echo*| xargs -n 1 cp file1` (2认同)

moo*_*dow 105

不,cp可以复制多个来源,但只会复制到一个目的地.您需要安排cp多次调用- 每个目标一次 - 用于您想要做的事情; 正如你所说,使用循环或其他工具.

  • @Nocturne:我说的哪一部分不正确?Robert给出了一个使用另一个工具来多次调用cp的例子.有许多可能的解决方案涉及使用其他工具或构造来做到这一点,但OP确实表明他已经意识到这是可能的. (22认同)
  • 这不是正确的答案.请看Robert Gamble的答案. (10认同)
  • @moonshadow:当然你的回答是正确的.我认为PlagueHammer想说在这种情况下,另一个答案更有用.也许你也可以在答案中加入类似的东西? (4认同)
  • 很遗憾,cp(和scp)支持该功能会很棒.然而,我们可以使用发球台进行分组.http://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets (2认同)

小智 77

通配符也适用于Roberts代码

echo ./fs*/* | xargs -n 1 cp test 
Run Code Online (Sandbox Code Playgroud)


小智 19

据我所见,您可以使用以下内容:

ls | xargs -n 1 cp -i file.dat
Run Code Online (Sandbox Code Playgroud)

-i的选项cp命令意味着你会被询问是否覆盖文件与当前目录file.dat.虽然它不是一个完全自动化的解决方案,但它对我有用.

  • 对我来说,它打印了一系列`cp:overwrite`问题,但我没有回答任何问题,也没有覆盖这些文件. (2认同)

det*_*erb 17

我会使用cattee基于我在https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets中找到的答案而不是cp.

例如:

cat <inputfile> | tee <outfile1> <outfile2> > /dev/null
Run Code Online (Sandbox Code Playgroud)


小智 9

ls -db di*/subdir | xargs -n 1 cp File

-b如果目录名中有空格,否则它将被xargs作为一个不同的项目破坏,这与echo版本有关


小智 9

这些答案似乎都比显而易见的复杂:

for i in /foo /bar; do cp "$file1" "$i"; done
Run Code Online (Sandbox Code Playgroud)


ogg*_*ust 6

不使用cp本身,但......

在将(慢速)SD卡上的大量Gopro素材复制到三个(慢速)USB驱动器的背景下,我想到了这一点.我想只读一次数据,因为它需要永远.我希望它是递归的.

$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )
Run Code Online (Sandbox Code Playgroud)

(如果你想要更多的输出,你可以添加更多的那些>()部分.)

我没有对此进行基准测试,但它肯定比cp-in-a-loop(或一堆并行的cp调用)快得多.


Tay*_*wee 5

如果您想在没有分叉命令的情况下执行此操作:

tee <inputfile file2 file3 file4 ... >/dev/null


Meg*_*kie 5

xargs在 Mac OS 上使用通配符复制到目录,唯一对我有用的目录名称中空格的解决方案是:

find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test 
Run Code Online (Sandbox Code Playgroud)

test要复制的文件在哪里
以及./fs*/*要复制到的目录

问题是 xargs 将空格视为新参数,使用-d-E不幸的是无法在 Mac OS 上正常工作的解决方案来更改分隔符。