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

pos*_*ing 12 command-line bash scripts

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

那么这两个有什么不同呢?与大括号相比,方括号有何不同?我也在谷歌上搜索“linux [..]”,但找不到任何东西,所以我能知道这些东西在 linux 术语中被称为什么吗?

谢谢

hee*_*ayl 15

  • {}称为大括号扩展。它有两种形式:{x..y}and {x,y},用任何字母或数字值替换xy

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

    在第二种显式形式中,{x,y}将扩展为仅x, y。例如,{2,5}将扩展为25

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

    需要注意的重要一点是,在文件创建/匹配过程中,无论任何文件匹配如何,都将进行大括号扩展(如果可能)。

  • []被称为路径名扩展(或通配)模式。与大括号扩展不同,您只能在匹配文件名时使用它,如果在创建文件时使用它,它将按字面处理。

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

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

    在第二种形式中,在单独匹配之前首先进行范围扩展,如果可能的话,否则按字面处理。因此,对于[2-5]. txt,它将匹配任何名为2.txtor3.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
Run Code Online (Sandbox Code Playgroud)

便携性注意事项:

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

大括号扩展 ,{}不是由 POSIX 定义的,因此不能在所有 shell 中移植。例如, dashsh在 Ubuntu 中)没有这个。它是从csh某些 shell 中借来的,并且只能在某些 shell 上工作,例如bash, zsh, ksh93, fish。在实施之前,请确保您使用的外壳支持这一点。


例子:

$ 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
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)


Joh*_*024 7

此处说明了两种形式之间的主要区别:

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt
Run Code Online (Sandbox Code Playgroud)

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

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