是否可以使用cp命令将单个文件复制到多个目录?
我尝试了以下,但没有用:
cp file1 /foo/ /bar/ cp file1 {/foo/,/bar}
我知道可以使用for循环,或者找到 . 但是可以使用gnu cp命令吗?
不, cp 可以复制多个来源,但只会复制到一个目的地 . 您需要安排多次调用 cp - 每个目的地一次 - 用于您想要做的事情;正如你所说,使用循环或其他工具 .
cp
单独使用 cp 无法执行此操作,但您可以将 cp 与 xargs 结合使用:
xargs
echo dir1 dir2 dir3 | xargs -n 1 cp file1
将 file1 复制到 dir1 , dir2 和 dir3 . xargs 将调用 cp 3次来执行此操作,有关详细信息,请参见 xargs 的手册页 .
file1
dir1
dir2
dir3
通配符也适用于Roberts代码
echo ./fs*/* | xargs -n 1 cp test
据我所见,您可以使用以下内容:
ls | xargs -n 1 cp -i file.dat
cp 命令的 -i 选项意味着将询问是否使用 file.dat 覆盖当前目录中的文件 . 虽然它不是一个完全自动化的解决方案,但它对我有用 .
-i
file.dat
我会根据我在https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets而不是 cp 看到的答案使用 cat 和 tee .
cat
tee
例如:
cat <inputfile> | tee <outfile1> <outfile2> > /dev/null
ls -db di*/subdir | xargs -n 1 cp File
-b 万一有 a space in directory name 否则它将被xargs作为一个不同的项目打破,有这个问题的回声版本
-b
这些答案似乎都比显而易见的复杂:
for i in /foo /bar; do cp "$file1" "$i"; done
不使用cp本身,但......
在将(慢速)SD卡上的大量Gopro素材复制到三个(慢速)USB驱动器的背景下,我想到了这一点 . 我想只读一次数据,因为它需要永远 . 我希望它是递归的 .
$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )
(如果你想要更多的输出,你可以添加更多的那些>()部分 . )
我没有对此进行基准测试,但它肯定比cp-in-a-loop(或一堆并行的cp调用)快得多 .
要在Mac OS上使用 xargs 复制到使用通配符的目录,目录名称中唯一有效的解决方案是: with 空格是:
find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test
test 是要复制的文件和 ./fs*/* 要复制到的目录
test
./fs*/*
问题是xargs将空格视为新参数,遗憾的是,使用 -d 或 -E 更改分隔符的解决方案在Mac OS上无法正常工作 .
-d
-E
如果你想在没有分叉命令的情况下这样做:
tee <inputfile file2 file3 file4 ... >/dev/null
基本上等同于xargs答案,但是如果你想要并行执行:
parallel -q cp file1 ::: /foo/ /bar/
因此,例如,将file1复制到当前文件夹的所有子目录(包括递归):
parallel -q cp file1 ::: `find -mindepth 1 -type d`
N.B . :这可能只对非常具体的用例传达任何明显的速度增益,例如:如果每个目标目录是一个不同的磁盘 .
它在功能上也类似于xargs的'-P'参数 .
你不能 .
我已经多次发现我可以使用这个功能所以我已经制作了自己的工具来为我做这个 .
http://github.com/ddavison/branch
很简单 -branch myfile dir1 dir2 dir3
branch myfile dir1 dir2 dir3
ls -d */ | xargs -iA cp file.txt A
假设您要将 fileName.txt 复制到当前工作目录中的所有子目录 .
fileName.txt
ls
allFolders.txt
ls > allFolders.txt
cat allFolders.txt | xargs -n 1 cp fileName.txt
另一种方法是使用猫和三通如下:
cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>
我认为这样效率会非常低,因为作业将分成几个进程(每个目标一个),硬盘驱动器将在盘片的不同部分一次写入多个文件 . 但是,如果您想将文件写入多个不同的驱动器,则此方法可能非常有效(因为所有副本可能同时发生) .
使用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
如果要将多个文件夹复制到多个文件夹,可以执行以下操作:
echo dir1 dir2 dir3 | xargs -n 1 cp -r / path / toyourdir / {subdir1,subdir2,subdir3}
如果您需要具体了解要复制文件的文件夹,可以将find与一个或多个greps结合使用 . 例如,要在任何子文件夹中替换任何出现的favicon.ico,您可以使用:
find . | grep favicon\.ico | xargs -n 1 cp -f /root/favicon.ico
这将复制到直接子目录,如果你想更深入,调整 -maxdepth 参数 .
-maxdepth
find . -mindepth 1 -maxdepth 1 -type d| xargs -n 1 cp -i index.html
如果您不想复制到所有目录,希望您可以过滤您不感兴趣的目录 . 示例复制到以 a 开头的所有文件夹
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 -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /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/
我知道这就像发出几个命令一样,但是当我想输入1行并离开一段时间时,它对我很有用 .
例如,如果您位于目标文件夹的父目录中,则可以执行以下操作:
for $ in $(ls);做cp sourcefile $ i; DONE
21 回答
不,
cp
可以复制多个来源,但只会复制到一个目的地 . 您需要安排多次调用cp
- 每个目的地一次 - 用于您想要做的事情;正如你所说,使用循环或其他工具 .单独使用
cp
无法执行此操作,但您可以将cp
与xargs
结合使用:将
file1
复制到dir1
,dir2
和dir3
.xargs
将调用cp
3次来执行此操作,有关详细信息,请参见xargs
的手册页 .通配符也适用于Roberts代码
据我所见,您可以使用以下内容:
cp
命令的-i
选项意味着将询问是否使用file.dat
覆盖当前目录中的文件 . 虽然它不是一个完全自动化的解决方案,但它对我有用 .我会根据我在https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets而不是
cp
看到的答案使用cat
和tee
.例如:
ls -db di*/subdir | xargs -n 1 cp File
-b
万一有 a space in directory name 否则它将被xargs作为一个不同的项目打破,有这个问题的回声版本这些答案似乎都比显而易见的复杂:
不使用cp本身,但......
在将(慢速)SD卡上的大量Gopro素材复制到三个(慢速)USB驱动器的背景下,我想到了这一点 . 我想只读一次数据,因为它需要永远 . 我希望它是递归的 .
(如果你想要更多的输出,你可以添加更多的那些>()部分 . )
我没有对此进行基准测试,但它肯定比cp-in-a-loop(或一堆并行的cp调用)快得多 .
要在Mac OS上使用
xargs
复制到使用通配符的目录,目录名称中唯一有效的解决方案是: with 空格是:test
是要复制的文件和
./fs*/*
要复制到的目录问题是xargs将空格视为新参数,遗憾的是,使用
-d
或-E
更改分隔符的解决方案在Mac OS上无法正常工作 .如果你想在没有分叉命令的情况下这样做:
tee <inputfile file2 file3 file4 ... >/dev/null
基本上等同于xargs答案,但是如果你想要并行执行:
因此,例如,将file1复制到当前文件夹的所有子目录(包括递归):
N.B . :这可能只对非常具体的用例传达任何明显的速度增益,例如:如果每个目标目录是一个不同的磁盘 .
它在功能上也类似于xargs的'-P'参数 .
你不能 .
我已经多次发现我可以使用这个功能所以我已经制作了自己的工具来为我做这个 .
http://github.com/ddavison/branch
很简单 -
branch myfile dir1 dir2 dir3
假设您要将
fileName.txt
复制到当前工作目录中的所有子目录 .ls
获取所有子目录名称,并将它们保存到一些临时文件中,例如allFolders.txt
xargs
.另一种方法是使用猫和三通如下:
我认为这样效率会非常低,因为作业将分成几个进程(每个目标一个),硬盘驱动器将在盘片的不同部分一次写入多个文件 . 但是,如果您想将文件写入多个不同的驱动器,则此方法可能非常有效(因为所有副本可能同时发生) .
使用bash脚本
如果要将多个文件夹复制到多个文件夹,可以执行以下操作:
echo dir1 dir2 dir3 | xargs -n 1 cp -r / path / toyourdir / {subdir1,subdir2,subdir3}
如果您需要具体了解要复制文件的文件夹,可以将find与一个或多个greps结合使用 . 例如,要在任何子文件夹中替换任何出现的favicon.ico,您可以使用:
这将复制到直接子目录,如果你想更深入,调整
-maxdepth
参数 .如果您不想复制到所有目录,希望您可以过滤您不感兴趣的目录 . 示例复制到以
a
开头的所有文件夹如果复制到任意/不相交的目录集,您将需要Robert Gamble的建议 .
我喜欢将文件复制到多个目录中:
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行并离开一段时间时,它对我很有用 .
例如,如果您位于目标文件夹的父目录中,则可以执行以下操作:
for $ in $(ls);做cp sourcefile $ i; DONE