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

nux*_*nux 82 command-line cp

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

cp ~/test.txt ~/folder1 ~/folder2
Run Code Online (Sandbox Code Playgroud)

但我没有成功。有没有办法在一个命令中做到这一点,以便我可以将文件甚至文件夹复制到多个目录?

Rad*_*anu 81

cp可以从多个源复制,但不能复制到多个目的地。查看man cp更多信息。

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

您可以在您的情况下使用它,如下所示:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt
Run Code Online (Sandbox Code Playgroud)

请注意,tee还将输入写入标准输出 (stdout)。所以如果你不想要这个,你可以通过将标准输出重定向到/dev/null如下来阻止它:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null
Run Code Online (Sandbox Code Playgroud)

  • 聪明,这是作弊!:) (12认同)
  • +1,聪明!如果你使用 `&gt;/dev/null` 也可以处理二进制文件,而不会弄乱终端...... (5认同)
  • @nux:与`cp` 不同,`tee` 只复制文件的内容,而忽略其模式、所有权、时间戳。避免重复文件名:`f=text.txt; &lt;~/$f tee ~/folder1/$f &gt; ~/folder2/$f` (4认同)
  • @nux 不要忘记在目录的情况下使用带有 `cp` 的 `-r` 选项 (2认同)

Syl*_*eau 71

实现复制到多个位置的另一种方法是以下命令:

find dir1 dir2 -exec cp file.txt {} \;
Run Code Online (Sandbox Code Playgroud)

如果 dir1 或 dir2 有您不想将文件复制到的子目录,请添加 -maxdepth 0选项:

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;
Run Code Online (Sandbox Code Playgroud)

请注意,除了复制它之外,这还将覆盖包含dir1dir2包含file.txt内容的每个文件。要仅复制file.txt而不影响这些目录中的其他文件,请告诉find仅对目录进行操作:

find dir1 dir2 -type d -exec cp file.txt {} \;
Run Code Online (Sandbox Code Playgroud)

  • 不错的解决方案!在我看来比搭配 T 恤更完美。 (4认同)
  • 如果“命令”的定义是“exec”调用,也许,但这是我书中的“一个命令”。 (3认同)
  • @SylvainPineau 实际上有 3 个:一个是 `find`,两次(在这种情况下)是 `cp`。并不是说`find`需要很多时间。 (2认同)
  • 我一直回到这个,所以我想我应该投赞成票:D (2认同)

Rma*_*ano 34

命令

cp ~/test.txt ~/folder1 ~/folder2
Run Code Online (Sandbox Code Playgroud)

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

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

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 
Run Code Online (Sandbox Code Playgroud)

(...如果文件名中嵌入了空格,请小心,您需要引用)。

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

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done
Run Code Online (Sandbox Code Playgroud)

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


Eva*_*lva 27

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

echo firstDir secondDir | xargs -n 1 cp test
Run Code Online (Sandbox Code Playgroud)

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

  • 这可能是对这个问题最好/最直接的答案 (3认同)

nux*_*nux 10

经过长时间的搜索,这部作品也像一个魅力!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done
Run Code Online (Sandbox Code Playgroud)

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

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您可以使用 `for dir in */; 在任何 Bourne 派生的 shell 中消除测试。` (5认同)
  • 在 `zsh` 中,这个答案的第一个命令可以简化为 `for dir in *(/); 执行 cp /path/file.txt "$dir"; 完成`。请参阅http://zsh.sourceforge.net/Intro/intro_2.html (2认同)