如何在bash脚本中将所有文件从一个目录复制到另一个目录

时间:2014-05-16 06:00:30

标签: linux bash

我想将所有文件从子目录复制到另一个目录而不复制原始文件夹。在终端我会这样做:

cp -r dir1/* dir2

然后dir2将包含dir1中的所有文件而不包含dir1本身。我试图在一个bash脚本中复制它,我收到一个错误。这是我的bash代码:

cp -r $pck_dir"/*" $TAR_DIR"/pck/"

我收到此错误:

cp: cannot stat ‘./mailman/lists/mailman/*’: No such file or directory

这很奇怪,因为我可以验证相关目录是否存在。我相信bash抱怨'*',但我不确定为什么。有人可以告诉我我做错了什么吗?

2 个答案:

答案 0 :(得分:14)

扩展devnull的评论:

  • 通配符周围的任何类型的引用,如*,都会阻止shell扩展通配符。因此,如果你想要一个斜杠后跟一个文字星,你应该只写"/*"

  • 不带引号的变量将受到分词的影响。因此,如果pck_dir的值为my dir,那么$pck_dir"/*"将扩展为两个单词mydir/*,这两个单词将作为单独的单词传递给cp参数。除非你想要分词,否则shell变量应该总是用双引号。

因此,为了得到你想要的东西,请使用:

cp -r "$pck_dir"/* "$TAR_DIR/pck/"

答案 1 :(得分:2)

请改用rsync命令行。

rsync -auv dir1 / dir2 /

将递归地将文件夹dir1中的所有文件同步到文件夹dir2。

man rsync

获取更多解释,了解如何使用此命令行。