【问题标题】:Difference between *.* and * when used with the cp command and the -R parameter [closed]*.* 和 * 与 cp 命令和 -R 参数一起使用时的区别 [关闭]
【发布时间】:2018-11-24 15:50:49
【问题描述】:

我只是想看看有什么区别

cp -R $rootpath/vgcore/core/src/geom/*.* $destpath/geom_src

,

cp -R $rootpath/vgcore/core/src/geom/* $destpath/geom_src

,

cp -R $rootpath/vgcore/core/src/geom $destpath/geom_src

cp -R $rootpath/vgcore/core/src/geom/ $destpath/geom_src

假设我们在 geom 中有一个子目录,比如 alg 里面有文件

  1. 如果是1,是不是只能把geom和alg中的所有文件都复制到geom_src中?那么源码的dir结构会被忽略吗?

  2. geom 中的所有文件和 alg + alg 本身中的所有文件都将被复制而不保留 subdir 结构?

  3. 和2一样吗?

  4. 和 2 & 3 一样吗?

抱歉,没有方便的测试 Linux 机器来自己测试。

谢谢。

【问题讨论】:

  • * 将匹配所有内容,*.* 将匹配其中包含点的任何内容。后两者在行为上是相同的。
  • 请注意,$rootpath$destpath 需要被引用 -- 如 "$rootpath""$destpath" -- 当它们包含的名称包含空格、IFS 中的字符、可以被评估为 glob(这通常会发生在包含方括号的名称中)等。shellcheck.net 将自动捕获此类错误。
  • 我投票结束这个问题,因为它不是一个编程问题,属于superuser.com/questions/tagged/linuxunix.stackexchange.com

标签: linux shell command-line


【解决方案1】:

cp -R $rootpath/vgcore/core/src/geom/. $destpath/geom_src

在 .../src/geom 中找到的每个名称中带有点的目录条目(文件和子目录)都将被复制到 .../geom_src

请注意,隐藏条目(名称以点开头的条目)不会被复制,因为它们不可见。

cp -R $rootpath/vgcore/core/src/geom/* $destpath/geom_src

此命令与上述相同,但更宽 - 将复制任何文件(或“目录条目”),而不仅仅是名称中包含点的文件。

cp -R $rootpath/vgcore/core/src/geom $destpath/geom_src

cp -R $rootpath/vgcore/core/src/geom/ $destpath/geom_src

是等价的,并且与以前不同。他们将单个对象(目录条目)复制到目标;单,因为没有指定通配符。以您的具体示例为例,这最后两个命令将复制 .../geom/ 中的所有内容,或多或少与以前相同,但它们将再复制一次,即目录“geom”本身!并且 /geom/ 中的所有文件仍将位于目标中新创建的“geom”下(假设它尚不存在)。

如果你问这个,那么也许你来自dos或windows。在 dos/winslow 下,在执行命令之前没有扩展 - 解释通配符的是命令本身。相反,在 unix 下,参数是预先展开的:如果您恰好在 .../src/geom/ 中有 200 个项目,则调用的程序(例如 cp)将收到 200 个参数。

另一个 dos/unix 区别是您提到的点 (* vs .)。 DOS 使用由两个部分组成的文件名,这些部分由一个(有时是不可见的)点分隔。 Unix 没有,点在文件名中没有特殊含义,除了以点开头的名称通常不会被 shell“看到”(因此被考虑)这一事实。

【讨论】:

  • 感谢您的详细回答,linuxfan!
【解决方案2】:

当您在 bash 中键入任何内容时,您所写的内容会在执行前被解析。

其中一个预执行任务是shell expansion(在本例中为文件名扩展)。

现在,让我们检查一下您的代码。

基本是cp -R what where,即*复制从what开始的所有内容,跟随符号链接并将其放入where *。

您的示例中不同的是what

示例 2、3 和 4 最终会做出同样的事情:复制所有内容。

第二个将其工作拆分为多个任务;更具体地说,$rootpath/vgcore/core/src/geom 中的每个文件夹依次对应一个; 最终,您将复制所有文件夹,就像在第三和第四个命令中一样。

顺便说一句,第一个例子是要求*.*,这是至少有一个点的所有内容

这意味着名称中没有点的每个文件夹都将被忽略。

【讨论】:

  • 非常感谢 ingroxd 的详细解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
相关资源
最近更新 更多