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

我尝试了以下方法,但没有奏效:

cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}

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


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


你不能单独使用cp,但你可以将cp和xargs结合起来:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

将file1复制到dir1、dir2和dir3。Xargs将调用cp 3次来完成此操作,详情请参阅Xargs的手册页。


另一种方法是使用cat和tee,如下所示:

cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>

我认为这将是相当低效的,尽管,因为工作将被分割在几个进程(一个目的地)和硬盘驱动器将写入几个文件一次在不同的部分盘片。然而,如果你想把一个文件写到几个不同的驱动器上,这个方法可能会非常有效(因为所有的拷贝都可以并发进行)。


通配符也适用于Roberts代码

echo ./fs*/* | xargs -n 1 cp test 

在我看来,你可以使用以下方法:

ls | xargs -n 1 cp -i file.dat

cp命令的-i选项意味着将询问您是否用file.dat覆盖当前目录下的文件。虽然这不是一个完全自动的解决方案,但它为我工作。


我会根据我在https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets上看到的答案使用cat和tee,而不是cp。

例如:

cat inputfile | tee outfile1 outfile2 > /dev/null

这将复制到直接子目录,如果你想深入,调整-maxdepth参数。

find . -mindepth 1 -maxdepth 1 -type d| xargs -n 1 cp -i index.html

如果您不想复制到所有目录,希望您可以过滤您不感兴趣的目录。复制到所有以a开头的文件夹

find . -mindepth 1 -maxdepth 1 -type d| grep \/a |xargs -n 1 cp -i index.html

如果复制到任意/不连贯的目录集,您将需要Robert Gamble的建议。


例如,如果你在目标文件夹的父目录中,你可以这样做:

I用$(ls)表示;执行cp source文件$i;完成


不——你不能。

我发现在很多情况下我可以使用这个功能,所以我制作了自己的工具来为我做这件事。

http://github.com/ddavison/branch

很简单—— 分支myfile dir1 dir2 dir3


如果你想复制多个文件夹到多个文件夹,你可以这样做:

echo dir1 dir2 dir3 | xargs -n 1 cp -r path / toyourdir - {subdir1 subdir2, subdir3}


如果需要指定要将文件复制到哪个文件夹,可以将find与一个或多个grep组合在一起。例如,要替换任何出现在任何子文件夹中的favicon.ico,你可以使用:

find . | grep favicon\.ico | xargs -n 1 cp -f /root/favicon.ico

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

如果目录名中有空格,则使用-b,否则将被xargs破坏为不同的项,在echo版本中有此问题


如果你想在没有fork命令的情况下执行:

Tee <inputfile file2 file3 fil4…> / dev / null


本质上等同于xargs的答案,但如果你想并行执行:

parallel -q cp file1 ::: /foo/ /bar/

例如,将file1复制到当前文件夹的所有子目录中(包括递归):

parallel -q cp file1 ::: `find -mindepth 1 -type d`

注意:这可能只在非常特定的情况下才会带来明显的速度提升,例如,如果每个目标目录是一个不同的磁盘。

它在功能上也类似于xargs的'-P'参数。


我喜欢复制一个文件到多个目录,就像这样: Cp file1 /foo/;Cp file1 /bar/;Cp file1 /foo2/;Cp file1 /bar2/ . 将一个目录复制到其他目录: Cp -r dir1/ /foo/;Cp -r dir1/ /bar/;Cp -r dir1/ /foo2/;Cp -r dir1/ /bar2/ .使用实例

我知道这就像发出几个命令,但当我想输入一行然后离开一会儿时,它对我来说很有效。


ls -d */ | xargs -iA cp file.txt A

假设要将fileName.txt复制到当前工作目录中的所有子目录。

通过ls获取所有子目录的名称,并将它们保存到某个临时文件中,例如allFolders.txt ls > allFolders.txt 打印列表并将其传递给命令xargs。 cat allFolders.txt | xargs -n 1 cp fileName.txt


不是使用cp本身,而是…

当我从一张(慢的)SD卡复制大量Gopro镜头到三个(慢的)USB驱动器时,我想到了这个问题。我想只读取一次数据,因为这要花很长时间。我想让它递归。

$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )

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

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


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

for i in /foo /bar; do cp "$file1" "$i"; done

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

find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test 

要复制的文件在哪里测试 和。/fs*/*要复制到的目录

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


使用bash脚本

DESTINATIONPATH[0]="xxx/yyy"
DESTINATIONPATH[1]="aaa/bbb"
                ..
DESTINATIONPATH[5]="MainLine/USER"
NumberOfDestinations=6

for (( i=0; i<NumberOfDestinations; i++))
    do
        cp  SourcePath/fileName.ext ${DESTINATIONPATH[$i]}

    done
exit

如果你所有的目标目录都匹配一个路径表达式——比如它们都是path/to的子目录——那么就像这样使用find和cp的组合:

find ./path/to/* -type d -exec cp [file name] {} \;

就是这样。