![如何使用 shell 命令列出以“s”为第一个字符、以“l”为最后一个字符的文件?](https://linux22.com/image/880615/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20shell%20%E5%91%BD%E4%BB%A4%E5%88%97%E5%87%BA%E4%BB%A5%E2%80%9Cs%E2%80%9D%E4%B8%BA%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E3%80%81%E4%BB%A5%E2%80%9Cl%E2%80%9D%E4%B8%BA%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在尝试列出以“s”和“l”开头的文件。
我正在尝试的命令是ls -l *sfa*
答案1
问题不是很清楚...根据您对@cmks 的评论,这里有两个选项:
如果您要查找文件名第一个字符为“s”且最后一个字符为“l”的文件 - 那么使用
ls -l s*l
如果您要查找文件名的第一个字符是(“a”或“s”)并且最后一个字符是(“a”或“l”)的文件 - 那么使用
ls [as]*[al]
如果是其他问题,请编辑您的问题以澄清...
您的版本ls -l sfa
将仅列出名称为“sfa”的文件(或者,如果有同名的目录,则列出该目录中的所有文件)。它似乎无法满足您的要求。
匹配文件名(“globbing”)的规则非常简单:
- “?”匹配任意单个字符
- “*” 匹配任意数量(零个或多个)的字符
- 使用方括号 ([]) 匹配集合中的单个字符:[fqsb] 匹配 f、q、s 或 b;[bd] 匹配 b、c 或 d
- 使用花括号 ({}} 来匹配几个特定字符串之一:{foo,bar} 匹配“foo”或“bar”。
目录分隔符“/”被排除在匹配之外——匹配仅针对文件名进行。
也可以看看Shell 通配符在 Ubuntu 帮助中。
答案2
ls -l s*l
ls -l s?l
- “*” 表示 0 个或多个字符
- 如果您想知道“s”和“l”之间的字母数量,则“?”表示 1 个字符。2 个“??”表示 2 个字符。
- 您还可以将集合放在 [] 之间。因此
ls -l s[a-z]l
将其限制为sal
通过szl
来自评论:
如果您想要以“s”和“a”开头的文件,您可以使用集合:
ls -l [sa]*
将列出以这 2 个字母开头的所有文件。您可以使用它来创建各种组。例如 [sa][df][1ojwfihwef]* 将使其搜索以 3 个字母开头且每个字母都与该特定组匹配的文件
答案3
ls
您可以一次为命令提供多个参数:
ls -l H* *l
实际情况是,shell 执行了Pathname Expansion
。你可以在 bash 的手册页中阅读更多相关信息:
man bash
因为是shell做的,所以shell调用该命令ls
如下:
ls -l Hejo Hesja Hejan Lesl Lesil Lesul Lestl
输入后即可理解,它不是命令ls
而是 shell 来查找匹配的路径名。
答案4
除了使用ls
命令和 shell 的通配符之外,还可以使用find
命令。
$ find -maxdepth 1 -iname "s*l"
./script.pl
./storm carl
./sal
./simple_curl