/ 之间的差异复制内容文件夹。和 /* 在 linux 中

sta*_*ave 8 linux shell

从我读过的文件夹中复制内容,用途是:

cp -rfva ../foldersource/. ./
Run Code Online (Sandbox Code Playgroud)

但这也有效

cp -rfva ../foldersource/* ./
Run Code Online (Sandbox Code Playgroud)

有什么区别吗?

例如,如果我想从文件夹中删除内容。:

rm -rf ../foldersource/.
Run Code Online (Sandbox Code Playgroud)

我收到错误:

rm:  rejet delete folder '.' or '..':
Run Code Online (Sandbox Code Playgroud)

但带星号就可以了

rm -rf ../foldersource/*
Run Code Online (Sandbox Code Playgroud)

那么,星号是适用于任何地方的更好选择吗?

ees*_*ada 10

这两种论证形式之间存在根本区别。了解正在发生的事情很重要。

随着../foldersource/.参数传递不变的命令,无论是cprm或别的东西。该尾随点是否具有不同于简单指向它所在目录的标准 Unix 约定的特殊或独特语义取决于命令;双方rmcp似乎把它当作一个特例。

在命令执行并传递任何参数之前../foldersource/*,shell 首先扩展参数。因此,永远不会看到;它可以看到扩展版本等等。这很重要,因为操作系统限制了可以传递给命令的参数数量,通常只有几百个。rm../foldersource/*../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1

  • `由命令决定尾随的点是否有意义` 嗯,点总是链接到包含目录本身,所以`../foldersource/.` 应该与声明`./foldersource/` 和事实上,它只是陈述同一件事的一种多余方式。没有命令试图“理解”点或双点,因为这些是 Linux/Unix 文件系统上的标准。`rm` 只是拒绝删除当前工作目录,如他们的回答中所说的 `jimmij`。另外,请注意,您在所有示例中都使用了 `./`,而 OP 在那里使用了 `../`。有点(大)差异。 (4认同)
  • 虽然这个答案说的是正确的,但它遗漏了@roaima 的答案中提到的一个非常重要的区别: /* 变体(通常)不会复制以 . (2认同)

roa*_*ima 10

当您复制使用cp -a source/* target/你最复制的文件和目录,从sourcetarget。具体来说,被排除的项目可能是.source.

考虑这些文件(或目录)在 source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will not be copied
Run Code Online (Sandbox Code Playgroud)

当您使用cp -a source/. target/复制时,您将复制 的全部内容source,包括以点 ( .)开头的任何项目到target

考虑这些文件(或目录)在 source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will be copied
Run Code Online (Sandbox Code Playgroud)

如果您使用bash, zsh,则可以使用该dotglob选项来更改 的含义,*以便它包含以点开头的文件和目录(yash也有一个dotglob选项;但是,它随后包含...限制了其可用性的全局扩展。另见FIGNORE='@(.|..)'ksh93)。

有趣的cp -a source/. target/是,保证永远不会创建组件target/source。(另一方面,cp -a source target/将根据是否target已存在执行两件事之一。有关详细信息,请参阅如何使用 cp幂等方式递归复制文件夹。)


当您使用rm -rf source/*删除时,您将删除其中source不以点 ( .)开头的文件和目录。以dotglob我已经提到的设置为准。它不会删除目录source本身。

当您尝试使用rm -rf source/.它删除时会失败 - 正如其他人已经解释的那样- 因为 POSIX 禁止删除其最后一个组件是.或的路径..。最接近的等效项是rm -rf source,它将删除source目录及其所有内容,无论它们是否以点 ( .)开头。


jim*_*mij 7

您不能这样做,rm -rf ../foldersource/.因为rm不允许这样做,如手册中明确所述:

任何删除最后一个文件名组成部分为“.”的文件的尝试。或 '..' 在没有任何提示的情况下被拒绝,如 POSIX 所规定的。

在 POSIX 手册中,man 1p rm我们看到:

如果文件 dot 或 dot-dot 中的任何一个被指定为操作数的基本名称部分(即最终的路径名组件),或者如果操作数解析为根目录,则 rm 应将诊断消息写入标准错误并且不执行任何操作更多这样的操作数。