ls [13]和ls {1,3}有什么区别?


11

我使用命令在目录中创建了三个文件touch inv{1..3}.txt。现在,我使用了两个命令,它们的输出几乎相同。这两个命令是ls inv[13].txtls {1,3}.txt

那么这两个有何不同?方括号与括号相比有何不同?我也一直在搜索“ linux [..]”,但是找不到任何东西,所以我能知道在Linux术语中这些东西是什么吗?

谢谢


2
其名称为“文件名扩展”或“ globbing”。
字节指挥官

文件名扩展或遍历是哪一个?是方括号([..])还是花括号({..})?
posixKing 2016年

Answers:


14
  • {}称为支撑扩展。它有两种形式:{x..y}{x,y},更换xy使用任何字母或数字值。

    在第一种形式中,{x..y}将扩展为从x到的所有值y。例如,{2..5}将扩大至2345

    在第二个明确的形式,{x,y}将扩大到只xy。例如,{2,5}将扩展为25

    如果无法扩展,则将模式按字面处理,例如{a..3}

    需要注意的重要一点是,在文件创建/匹配时,不管文件是否匹配,都将进行大括号扩展(如果可能)。

  • []被称为路径名扩展(或遍历)模式。与括号扩展不同,您只能在匹配文件名时使用它,如果在创建文件时使用它,则会按字面意义对待它。

    它有两种形式:[xyz...][x-y]

    在第一种形式中,它将单独匹配方括号内的任何单个字符,即每个字符都被单独对待。因此,对于[25].txt它匹配一个文件名为2.txt5.txt在当前目录,而[245].txt它将匹配命名的任何文件2.txt4.txt5.txt

    在第二种形式中,首先进行范围扩展,然后再进行单独匹配,如果可能的话,可以逐字处理。因此[2-5]. txt,它将匹配任何名为2.txtor 3.txt4.txtor的文件5.txt。如果范围无法扩展,则将按字面处理,例如在的情况下[a-3].txt


两者之间的重要行为差异是,有更多的模式要匹配,而实际匹配的模式更少。由于括号扩展无论如何都将完成,它将显示错误消息,指出某些文件不存在,而路径名扩展将尽可能匹配,而其余部分则没有任何错误:

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

便携性注意事项:

[]路径扩展操作由POSIX Bourne shell和衍生物中,因此便携式定义。

括号扩展{}POSIX没有定义,因此不能在所有shell中移植。例如, dashsh在Ubuntu中)没有此功能。这是从借来的csh和某些贝壳将只例如bashzshksh93fish。在实施之前,请确保您使用的Shell支持此功能。


例:

$ touch {1..3}.txt

$ ls {1..3}.txt
1.txt  2.txt  3.txt

$ ls {1,2,3}.txt
1.txt  2.txt  3.txt

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory

$ ls [123].txt
1.txt  2.txt  3.txt

$ ls [1-3].txt
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory

1
[ ]没有匹配项时,应避免依赖于扩展行为,因为根据外壳配置的不同,扩展行为可能有所不同。如果要使用[]在文件名中使用,请在命令中用引号引起来。还值得注意的是{13..79}和之间的区别[13-79]。第一会产生的所有数字范围从1379,第二个将匹配的字符134567,和9
kasperd '16

@kasperd是的,这就是nullglob(或类似的)目的。关于[13-79]匹配,我想我在回答中清楚地提到了[]的每个字符的行为。
heemayl

@heemayl我想值得一提的是{{..3}`形式是bashism。这不会破折号。我认为ksh具有此功能,但不是更现代的风味,例如mksh和pkdsh
Sergiy Kolodyazhnyy

@Serg添加了可移植性说明。
heemayl

7

两种形式之间的主要区别如下所示:

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt

inv[15].txt是一个glob,将扩展文件系统上匹配文件的列表。这是路径名扩展

inv{1,5}.txt扩展到文件系统上的实际文件,inv1.txtinv5.txt不管文件到底是什么。这是大括号扩展


另一个主要区别是您可以书写,ba{con,tman}并且使用方括号没有等效项。IOW,大括号扩展不仅限于单个字符。
hobbs
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.