如何使用命令行将文件复制到多个文件夹?


67

我试图test.txt用一个命令将文件复制到多个目录:

cp ~/test.txt ~/folder1 ~/folder2

但是我没有成功。有没有一种方法可以在一个命令中执行此操作,以便我可以将文件甚至文件夹复制到多个目录?


不容易。你可能想看看“rsync的”有效地更新文件夹的多个现有副本
托尔比约恩Ravn的安德森

3
尝试学习一些bash脚本。它会变得非常有用:for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done
Shahbaz 2014年

这不是一个命令,但可能只会帮助在这里偶然发现的人:cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2
ManuJärvinen16年

Answers:


71

cp可以从多个来源复制,但不能复制到多个目的地。请参阅man cp以获取更多信息。

我知道唯一可以将其复制/保存到多个目标的bash命令是tee

您可以按以下方式使用它:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

请注意,tee还将输入写入标准输出(stdout)。因此,如果您不希望这样做,可以通过将标准输出重定向到/dev/null如下方式来防止它:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null

10
聪明,那是作弊!:)
terdon

5
+1,聪明!如果您也使用>/dev/null带有二进制文件的作品,而又不会弄乱终端...
Rmano 2014年

1
为您+1,您总是这样:),但是如果我要复制目录怎么办?
马钱

2
@nux不要忘记在目录中使用-r选项cp
RaduRădeanu2014年

4
@nux:teecp仅复制文件的内容而忽略其模式,所有权和时间戳不同。为了避免重复文件名:f=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
jfs 2014年

61

以下是将副本复制到多个位置的另一种方法:

find dir1 dir2 -exec cp file.txt {} \;

如果dir1或dir2包含不想将文件复制到的子目录,请添加 -maxdepth 0option:

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

请注意,这将覆盖所有的文件dir1dir2file.txt的内容,除了复制它。要仅复制file.txt而不影响这些目录中的其他文件,find请仅对目录执行以下操作:

find dir1 dir2 -type d -exec cp file.txt {} \;

4
不错的解决方案!在我看来,比使用tee更完美。
Danatela

1
实际上,不涉及重定向,它仍然是一个命令。
Sylvain Pineau'3

2
@SylvainPineau实际上有3:一个是find并且两次(在这种情况下)cp。并不是说find需要很多时间。
RaduRădeanu2014年

3
如果“命令”的定义是“ exec”调用,也许可以,但这在我的书中是“一个命令”。
kojiro 2014年

2
我继续回到这个话题,所以以为我应该投反对票:D
Jonathan

31

命令

cp ~/test.txt ~/folder1 ~/folder2

尝试将两个文件(~/test.txt~/folder1)复制到目标folder2。(如果~/folder2存在并且是目录,则将显示“省略目录”警告)。

如果要制作文件的多个副本,则test.txt必须使用循环或多个命令...

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

(...,请注意,如果文件名中嵌入空格,则需要引号)。

要复制整个目录,您必须使用以下-r选项:

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

这将创建~/folder1/folder3~/folder2/folder3包含所有文件。


1
对于过去的读者:根据规范,for循环是复合命令。因此,这仍然是一个命令,并且满足该问题的所有要求。
kojiro 2014年

@nux,我不同意更正。1)两个大写字母是错误的,我的意图是将命令插入短语中。2)省略号是样式问题;请让我的风格英寸
Rmano

1
好的,对不起,我认为情况会好些。
NUX

在我的系统上,它不会将folder3保存为〜/ folder1 / folder3,而是将folder3中的所有内容都复制到folder1中
alpha_989

23

您可以创建一个帮助脚本,也可以使用xargs一个打印功能(在本例中为echo)来实现:

echo firstDir secondDir | xargs -n 1 cp test

cp使用测试文件作为参数,这将使每个目录成为函数的参数。


这可能是对这个问题的最好/最直接的答案
Bryson S.18年

7

经过长时间的搜索,这项工作也像吊饰一样!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

这会将file.txt复制到终端当前位置的每个目录中。

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

这会将文件夹复制到终端当前位置的每个子目录中。

我希望它也能帮助其他人。


在中zsh,您可以用于for i in *(/); ...遍历所有子目录,因此可以避免[ -d ...测试。长时间的全球化是我喜欢它的原因之一bash
Rmano 2014年

可以在命令中再次修改代码的权限
吗?

1
在中zsh,此答案的第一个命令可以简化为for dir in *(/); do cp /path/file.txt "$dir"; done。参见zsh.sourceforge.net/Intro/intro_2.html
Rmano 2014年

5
您可以使用for dir in */;
Henk Langeveld

@nux效果很好,该命令非常易于遵循。它应该被投票更高!
nukeguy

1

如果要将文件test.txt复制到/ tmp / target /中的每个目录中,则...

创建一个测试环境:

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

复制它:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;

0

只是想改变答案 Sylvain Pineau

dir1dir2不在当前目录中。

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

在这里,find将查找dir1两个级别的深度,或者您可以省略-maxdepth参数以dir1在当前目录及其下的所有文件夹中查找。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.