繁体   English   中英

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

[英]How to copy a file to multiple directories using the gnu cp command

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

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

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

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

您不能单独使用cp执行此操作,但可以将cpxargs结合使用:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

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

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

通配符也适用于罗伯茨代码

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

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

例如:

cat inputfile | tee outfile1 outfile2 > /dev/null

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

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

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

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

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

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

-b以防目录名称中有空格,否则 xargs 会将其作为不同的项目破坏,echo 版本有此问题

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

在将大量 Gopro 镜头从(慢速)SD 卡复制到三个(慢速)USB 驱动器的情况下,我想到了这一点。 我只想读取数据一次,因为它需要永远。 我希望它是递归的。

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

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

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

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

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

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

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

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

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

本质上等同于 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>

我认为这将是非常低效的,因为这项工作将被分成几个进程(每个目的地一个)并且硬盘驱动器将在盘片的不同部分一次写入多个文件。 但是,如果您想将一个文件写入多个不同的驱动器,这种方法可能会非常有效(因为所有副本可以同时发生)。

你不能。

我多次发现我可以使用此功能,因此我制作了自己的工具来为我执行此操作。

http://github.com/ddavison/branch

很简单——
branch myfile dir1 dir2 dir3

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

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

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

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

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

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

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

回声目录 1 目录 2 目录 3 | xargs -n 1 cp -r /path/toyourdir/{subdir1,subdir2,subdir3}

如果你所有的目标目录都匹配一个路径表达式——就像它们都是path/to子目录——那么只需将findcp结合使用,如下所示:

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

就是这样。

如果您需要明确将文件复制到哪些文件夹中,您可以将 find 与一个或多个 grep 结合使用。 例如,要替换任何子文件夹中出现的 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

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

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

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

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

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

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

对于我在 $(ls); 做 cp 源文件 $i; 完毕

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM