列出匹配某个模式的文件但忽略匹配另一个模式的文件?

Ste*_*ven 12 linux ls bash patterns

假设我有一个包含文件 a1、a2、a3、b1、b2、b3 的目录。我只想匹配开头a但不包含3. 我试过了,ls -I "*3" *a*但它返回a1 a2 a3,即使我不希望它匹配a3。这可能ls吗?

cha*_*aos 14

只是:

shopt -s extglob  
ls a!(*3*)
Run Code Online (Sandbox Code Playgroud)
  • shopt -s extglob 激活扩展的通配。
  • a 匹配起始 a
  • !()否定()...
    • *3*这是3什么以及它之前或之后的任何东西。

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2
Run Code Online (Sandbox Code Playgroud)


Tom*_*unt 8

现有答案很好地说明了使用 globs 做到这一点的最佳方法;我将包括它,因为在大多数情况下,find如果您想进行脚本编写或进一步处理,这是一个更好的选择:

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2
Run Code Online (Sandbox Code Playgroud)

您可以将答案提供xargs给简单的操作,或者将答案提供给while read更复杂的事情的循环。


小智 3

一个简单的方法是

  • 列出所有匹配的文件a*
  • 然后删除所有包含a的行3

UNIX 命令是

ls -1 a* | grep -v 3
Run Code Online (Sandbox Code Playgroud)

ls -1每行显示一个文件。

grep通常查找与模式匹配的行,但-v这种行为是相反的,即 grep 查找与该模式不匹配的行。

  • 解析“ls”不是一个好主意:http://mywiki.wooledge.org/ParsingLs (3认同)
  • 嗨彼得!最好尽可能详细地解释您的解决方案的工作原理。 (2认同)