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

13

我想将一个子目录中的所有文件复制到另一个目录,而不复制原始文件夹。在终端中,我只需执行以下操作:

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在抱怨“*”,但我不确定原因。有人能告诉我我做错了什么吗?


4
“cp -r "$pck_dir"/* "$TAR_DIR"/pck/”这段指令被投票标记为拼写错误。 - devnull
在使用变量时,将其放在大括号 {} 中是否会有问题?例如:cp -r ${pck_dir}/* ${TAR_DIR}/pck/ - PradyJord
4
这是一个明确陈述问题及答案的问题。我曾经遇到同样的问题,但幸亏有了这个问题的答案,现在不再有这个问题了。这个问题被关闭的解释毫无意义。 - andreasdr
2个回答

20

根据devnull的评论进行扩展:

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

  • 未加引号的变量将受到单词拆分的影响。因此,如果的值为my dir,那么$pck_dir"/*"将被扩展为两个单词mydir/*,并且这两个单词将作为单独的参数传递给cp。除非你想进行单词拆分,否则应始终使用双引号括住Shell变量。

因此,要获得你想要的结果,请使用:

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

3
请使用rsync命令行代替。
rsync -auv dir1/ dir2/
将递归地同步文件夹dir1中的所有文件到文件夹dir2中。
请参阅man rsync以获取更多解释,了解如何使用此命令行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接