在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上,文件名中允许出现各种字符。这包括空格、标点符号,甚至表情符号和换行符。除了斜线和null字符,任何东西都可以出现在文件名中。
如果我们不正确地引用这些名字,它们将在我们的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解释了。
5.总结
在这篇快速而直接的文章中,我们着重介绍了将一个文件复制到多个目录–;对于预定义和通配符的输入。