在Linux上将文件复制到多个目录
1. 概述
在本教程中,我们将学习如何在 Linux 上将文件复制到多个目录。这些命令适用于任何 POSIX shell,包括bash 。
2. 单一目录
我们可以使用cp 命令非常简单地将文件复制到单个目录:
cp source1 source2 ... directory
不过, cp只需要一个目标目录。
那么,我们如何将一个文件复制到多个目录呢?
2. shell循环
让我们尝试**使用循环重复复制命令。**这会将favicon.ico文件复制到dir-1和dir-2:
for i in dir-1 dir-2; do cp favicon.ico ${i}/; done
i变量后面的斜杠确保我们复制到目录而不是文件。花括号不是必需的,但它们可能有助于提高可读性。
3. 处理特殊字符
让我们看看如何处理更多奇特的文件名。
**我们应该记住,在 Linux 上,文件名中允许使用各种字符。**这包括空格、标点符号,甚至表情符号和换行符。除了斜杠和空字符之外的任何内容都可以出现在文件名中。
如果我们没有正确引用它们,这些名称将在我们的 shell 脚本中造成严重破坏。
让我们使用带引号的文件名并引用i变量:
for i in "I'm a directory!" 'Another directory'; do cp favicon.ico "${i}/"; done
4. 通配符匹配
如果我们想使用一些搜索条件动态地提供目标目录怎么办?
例如,让我们将 favicon 文件复制到*/var/www内的所有目录,但只有以staging结尾的目录,例如/var/www/recipe-site-staging*:
find /var/www -maxdepth 1 -iname '*staging' -type d -exec cp -- favicon.ico '{}' ';'
find 将在/var/www中搜索指定的目录。
在此示例中,我们使用*-maxdepth 1查找直接位于/var/www内部而不是多个级别的目录。例如,这可以确保/var/www/site-staging匹配,但/var/www/static/site-staging*不匹配。
-iname是我们要查找的目录名称的不区分大小写模式,其中 * 是通配符。
-exec是一个方便的参数,它指示在每个目录上运行什么命令。
我们要运行的命令是cp — favicon.ico directory-name。**双破折号用于终止cp的选项列表。*这可以确保名为–force之类的目录不会意外地充当cp*命令的选项。
花括号指示在我们的命令中放置目录名称的位置。我们用分号表示命令的结束。
请注意,我们将花括号和分号放在单引号中,因此它们不会被 shell 解释。