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


8

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

cp -rfva ../foldersource/. ./

但这也有效

cp -rfva ../foldersource/* ./

有什么区别吗?

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

rm -rf ../foldersource/.

我得到错误:

rm:  rejet delete folder '.' or '..':

但是带星号可以

rm -rf ../foldersource/*

那么,星号是可以在任何地方使用的更好的选择吗?

Answers:


10

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

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

随着../foldersource/*争论首先由外壳扩展之前是不断,甚至执行命令,并通过任何参数。因此,rm永远看不到../foldersource/*;它会看到扩展版本../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1,依此类推。这很重要,因为操作系统限制了可以传递给命令的参数数量,通常只有几百个。


4
It's up to the command whether that trailing dot makes any sense嗯,点总是链接到包含目录本身,因此../foldersource/.与声明没有什么不同./foldersource/,实际上,它只是陈述同一件事的一种冗余方式。没有命令试图“理解”点或双点,因为它们是Linux / Unix文件系统上的标准配置。rm只是拒绝jimmij按照答案中的说明删除当前工作目录。另外,请注意,./OP在../那里时,您正在使用所有示例。有点(大)差异。
Sergiy Kolodyazhnyy

“ cp -rfva ../foldersource/。./”等效于“ cp -rfva ../foldersource ./”,我要复制文件夹源的内容,而不是文件夹根
stackdave

1
@Stackdave不,cp -rfva ../foldersource/. ./ 不等同于 cp -rfva ../foldersource ./。尾随/.意义重大
roaima

2
虽然此答案说的是正确的,但它缺少@roaima答案中提到的非常重要的区别:/ *变体不会(通常)复制以开头的文件或目录。
亚当

@SergiyKolodyazhnyy你是对的;这.是Unix中的标准约定,用于直接表示当前值。另外,感谢您指出./我应该在示例中使用的../;我会解决的。您对命令是否“有意义”尾随点是错误的。作为OP点出来(我已经经历了cp)都rmcp不同的行为时,尾随.存在。我应该写过类似的内容,“如果尾随点具有特殊或独特的语义,则取决于命令”。为了清楚起见,我将更改答案。
eestrada

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

使用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目录及其所有内容,无论它们是否以点(.)开头。


1
另请参见'rm。*'是否删除了父目录?关于rm -rf .失败
斯特凡Chazelas

7

您不能这样做,rm -rf ../foldersource/.因为rm不允许这样做,正如手册中明确指出的那样:

尝试删除最后一个文件名成分为“。”的文件。或“ ..”在没有任何提示的情况下被拒绝,这是POSIX要求的。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.