如何使用gnu cp命令将文件复制到多个目录
是否有可能使用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
将文件1复制到dir1
, dir2
和dir3
。 xargs
会调用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
看到的答案来使用cat
和tee
。
例如:
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
复制到当前工作目录下的所有子目录中。
-
通过
ls
获取所有的子目录名称,并将它们保存到一些临时文件,allFolders.txt
ls > allFolders.txt
-
打印列表并将其传递给命令
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