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

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

我尝试了以下,这是行不通的:

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

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

不, cp可以复制多个来源,但只能复制到一个目的地。 你需要安排调用cp多次 – 每个目的地一次 – 你想做什么; 正如你所说,使用循环或其他工具。

你不能单独用cp做这个,但是你可以把cpxargs结合起来:

 echo dir1 dir2 dir3 | xargs -n 1 cp file1 

将文件1复制到dir1dir2dir3xargs会调用cp 3次来执行此操作,详细信息请参阅xargs的手册页。

通配符也适用于Roberts代码

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

据我可以看到它可以使用以下内容:

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

cp命令的-i选项表示将询问是否用file.dat覆盖当前目录中的file.dat 。 虽然它不是一个完全自动的解决scheme,但它为我解决了。

我会根据我在https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets而不是;cp看到的答案来使用cattee

例如:

 cat <inputfile> | tee <outfile1> <outfile2> > /dev/null 

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

-b目录名中有空格的情况下,否则它会被xargs分解为不同的项目,这个问题与echo版本有关

不使用CP本身,但…

这对我来说,是从(慢速)SD卡将大量Gopro素材复制到三个(慢速)USB驱动器的环境中。 我只想读取一次数据,因为它花了很长时间。 我希望它recursion。

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

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

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

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

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

如果你想不做分叉命令:

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

基本上等价于xargs的答案,但是如果你想要并行执行的话:

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

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

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

注意:这可能只是为非常具体的使用情况传达任何明显的速度收益,例如,如果每个目标目录是不同的磁盘。

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

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

另一种方法是使用猫和三通,如下所示:

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

我认为这样做效率会很低,因为这个工作会被分成几个进程(每个目的地一个进程),而硬盘将会在不同的盘片上同时写入几个文件。 但是,如果您想将文件写入多个不同的驱动器,则此方法可能非常高效(因为所有副本都可能同时发生)。

你不能。

我多次发现,我可以使用这个function,所以我做了我自己的工具来为我做这个。

http://github.com/ddavison/branch

很简单 –
branch myfile dir1 dir2 dir3

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

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

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

  1. 通过ls获取所有的子目录名称,并将它们保存到一些临时文件, allFolders.txt

     ls > allFolders.txt 
  2. 打印列表并将其传递给命令xargs

     cat allFolders.txt | xargs -n 1 cp fileName.txt 

要在Mac OS上使用xargs复制到使用通配符的目录,唯一的解决scheme是使用目录名称中的空格为我工作:

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

其中test是要复制的文件
./fs*/*复制到的目录

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

如果您需要特定于哪个文件夹来复制文件,您可以将find与一个或多个grep结合使用。 例如,要replace任何子文件夹中的favicon.ico任何发生,您可以使用:

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

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

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

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

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

如果复制到一个任意/不相交的目录集,你需要Robert Gamble的build议。

我喜欢将一个文件复制到多个目录,如下所示: cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/ cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/ 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/ cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/

我知道就像发出几个命令一样,但是当我想input1行并离开一段时间时,它对我来说很好。

例如,如果您在目标文件夹的父目录中,则可以执行以下操作:

因为我在$(ls); 做cp源文件$我; DONE