复制时*和*。*有什么区别?


19

以下2条命令有什么区别?

cp -rp /dir1/*.* /dir2/
cp -rp /dir1/* /dir2/

12
尽管两个答案都是正确的,但我认为有一点要注意。隐藏的文件(以.like 开头的文件.bashrc)不会被任何这些命令复制。要复制这些文件,您应该明确指出,.*复制所有文件(包括隐藏文件)的命令将是cp -rp /dir1/.* /dir1/* /dir2/
YoMismo

简而言之,*.*是MS-DOS / Windows方式,而*UNIX / Linux方式。在Unix后缀(文件结尾,.- .txt或后面的部分.jpg是可选的...)在MS-DOS中,.(点)和后缀是必需的,因此要匹配所有文件,一个要用*.*-匹配所有文本文件。 ,一个会用*.txt
Baard Kopperud 2015年

不需要@BaardKopperud后缀,可能有名称为FILENAME甚至的文件FILE
Ruslan 2015年

1
@Ruslan但*.*在DOS中仍匹配名为FILENAME或的文件FILE,因为名称为'really' FILENAME.FILE.(扩展名为空)。在Unix中,名称是'really' FILENAMEFILE,因此*.*不会匹配。
乔纳森·

1
@Ruslan在实际的DOS上是必需的,在Windows上不再需要。在过去,单身*只会匹配FILE不会 匹配FILE.TXT
Random832

Answers:


25

*.*只匹配中间或末尾带有点的文件名。例如:

abc.jpg
def. 

*与上面的文件名匹配,再加上完全没有点的名称。例如:

data

6
也许还要注意,反习惯用法*.*曾经是匹配8 + 3文件名之日MS-DOS上所有文件的正确方法。在MS-DOS中,点是强制性的(尽管隐含在没有扩展名的文件中)。
三胞胎2015年

11
@Mark,不,我不这么认为。除非您启用dotglob。
David Dai

11
呵呵,我从没意识到*.*匹配,foo.但是没有.foo。这种不对称是可怕的。
jamesdlin

9
@jamesdlin,来自bash手册:当将模式用于文件名扩展时,字符“。” 除非设置了shell选项dotglob,否则必须显式地匹配文件名开头或斜杠后的斜杠。
David Dai

1
@jamesdlin。从Unix的第一天(大约1969年)开始,以点开头的目录条目被认为是hidden。最初需要跳过所有目录(甚至空目录)中始终存在的.(当前目录)和..(父目录)条目。Ritchie和Thompson后来认为它是隐藏(默认情况下)所有.*rc配置文件的有用功能,并添加了显式-a选项ls来显示所有这些(前导点)“隐藏”条目。因此,了解Unix历史并不奇怪。自“永远”以来,Unix中的领先点一直很特殊。
arielf 2015年

13

假设您在中有以下文件/dir1

foobar  
foo.bar  
fo.ba  
foo1.bar2  
foobar1  
foobar2  

cp -rp /dir1/*.* /dir2/

此命令将仅复制以下文件:

foo.bar  
fo.ba  
foo1.bar2 

cp -rp /dir1/* /dir2/

这将复制所有文件 /dir1

此条件也适用于中的子目录/dir1

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.