与cp命令和-R参数一起使用时*。*和*之间的差异

时间:2018-11-24 15:50:50

标签: linux shell command-line

我只想了解

有什么区别
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. 如果是一个,是否只将所有文件从geom和alg复制并放入geom_src?那么源的目录结构会被忽略吗?

  2. geom中的所有文件以及alg + alg本身中的所有文件都将通过保留子目录结构进行复制?

  3. 等于2吗?

  4. 与2和3一样吗?

抱歉,没有方便的Linux测试机器可以自己进行测试。

谢谢。

2 个答案:

答案 0 :(得分:0)

  

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的另一个区别是您提到的点(*与)。 DOS使用由两部分组成的文件名,两部分之间用一个点(有时不可见)分隔。 Unix并不这样,除了文件名通常不被外壳“看到”(并因此考虑)以外,文件名中的点没有特殊含义。

答案 1 :(得分:-1)

在bash中键入任何内容时,将在执行之前对您编写的内容进行解析。

shell expansion(在此情况下为文件名扩展)是预执行任务之一。

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

基本是cp -R what where,它是*复制从what开始的所有内容,并遵循符号链接,然后将其放入where *。

您的示例的不同之处在于what

示例2、3和4最终将产生相同的效果:复制所有内容。

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

顺便说一句,第一个示例是要求*.*,它是其中至少包含一个点的所有内容

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