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

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

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

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


当前回答

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

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

其他回答

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

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

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

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

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

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

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

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

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

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

echo dir1 dir2 dir3 | xargs -n 1 cp file1

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

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

通配符也适用于Roberts代码

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