Answers:
这两种论证形式之间有根本的区别。理解正在发生的事情是很重要的。
随着../foldersource/.参数传递不变的命令,无论是cp或rm或别的东西。该尾随点是否具有特殊的语义或独特的语义取决于该命令,该语义不同于仅指向其所在目录的标准Unix约定;双方rm并cp似乎把它当作一个特例。
随着../foldersource/*争论首先由外壳扩展之前是不断,甚至执行命令,并通过任何参数。因此,rm永远看不到../foldersource/*;它会看到扩展版本../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1,依此类推。这很重要,因为操作系统限制了可以传递给命令的参数数量,通常只有几百个。
.是Unix中的标准约定,用于直接表示当前值。另外,感谢您指出./我应该在示例中使用的../;我会解决的。您对命令是否“有意义”尾随点是错误的。作为OP点出来(我已经经历了cp)都rm和cp不同的行为时,尾随.存在。我应该写过类似的内容,“如果尾随点具有特殊或独特的语义,则取决于命令”。为了清楚起见,我将更改答案。
使用cp -a source/* target/进行复制时,会将大多数文件和目录从复制source到target。特别是,排除的项目可能是文件.中以顶级(。)开头的文件source。
考虑以下文件(或目录) source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will not be copied
使用cp -a source/. target/进行复制时,您正在复制的全部内容source,包括以点(.)开头的所有项目到target
考虑以下文件(或目录) source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will be copied
如果使用的是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禁止删除最后一个成分为.or 的路径..。最接近的等价项是rm -rf source,它将删除source目录及其所有内容,无论它们是否以点(.)开头。
rm -rf .失败。
It's up to the command whether that trailing dot makes any sense嗯,点总是链接到包含目录本身,因此../foldersource/.与声明没有什么不同./foldersource/,实际上,它只是陈述同一件事的一种冗余方式。没有命令试图“理解”点或双点,因为它们是Linux / Unix文件系统上的标准配置。rm只是拒绝jimmij按照答案中的说明删除当前工作目录。另外,请注意,./OP在../那里时,您正在使用所有示例。有点(大)差异。