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

时间:2008-10-12 16:21:56

标签: linux bash shell

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

我尝试了以下操作,但没有效果:

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

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

22 个答案:

答案 0 :(得分:562)

您不能仅使用cp执行此操作,但可以将cpxargs合并:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

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

答案 1 :(得分:101)

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

答案 2 :(得分:76)

通配符也适用于Roberts代码

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

答案 3 :(得分:19)

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

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

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

答案 4 :(得分:17)

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

例如:

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

答案 5 :(得分:9)

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

-b以防目录名称中的空格,否则xargs会将其作为不同的项目拆分,这与echo版本存在此问题

答案 6 :(得分:9)

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

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

答案 7 :(得分:6)

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

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

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

(如果您想要更多输出,可以添加更多这些&gt;()部分。)

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

答案 8 :(得分:4)

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

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

test是要复制的文件 并./fs*/*要复制到

的目录

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

答案 9 :(得分:3)

如果你想在没有分叉命令的情况下这样做:

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

答案 10 :(得分:2)

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

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

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

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

N.B。:这可能只为非常具体的用例传达任何明显的速度增益,例如:如果每个目标目录是一个不同的磁盘。

它在功能上类似于&#39; -P&#39; xargs的论据。

答案 11 :(得分:1)

使用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

答案 12 :(得分:0)

不 - 你不能。

我多次发现我可以使用此功能,所以我已经为自己制作了自己的工具。

http://github.com/ddavison/branch

很简单 -
branch myfile dir1 dir2 dir3

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

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

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

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

答案 15 :(得分:0)

另一种方法是按如下方式使用猫和三通:

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

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

答案 16 :(得分:0)

如果所有目标目录都匹配路径表达式(例如它们都是path/to的子目录),则只需将findcp结合使用,如下所示:

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

就是这样。

答案 17 :(得分:-1)

如果要将多个文件夹复制到多个文件夹,可以执行以下操作:

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

答案 18 :(得分:-2)

如果您需要具体了解要复制文件的文件夹,可以将find与一个或多个greps结合使用。例如,要在任何子文件夹中替换任何出现的favicon.ico,您可以使用:

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

答案 19 :(得分:-3)

这将复制到直接子目录,如果您想要更深入,请调整-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的建议。

答案 20 :(得分:-3)

我喜欢将文件复制到多个目录中: 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/

我知道这就像发出了几个命令,但是当我想输入1行并离开一段时间时,它对我来说效果很好。

答案 21 :(得分:-4)

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

for $ in $(ls);做cp sourcefile $ i;完成