使用 grep 过滤带有数字的文件夹

使用 grep 过滤带有数字的文件夹

我试图仅列出带有数字的文件夹以过滤ls -1(选项-1每行列出一个文件)通过 grep (我知道 find 也可以做到这一点,但为了举个例子,我还是坚持使用 grep)

文件夹是

PC:test user$ ls -1
1184
36
69929
7
9907

现在,这是我通过不同的输出所得到的结果......

这个:我不明白为什么 9907 在那里,因为不知何故只有个位数 7 文件夹才有意义?

PC:test user$ ls -1 | grep [0-9]
7
9907

缺少 7。.平均值是 2 还是更大?

PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907

这是否意味着匹配其中的所有内容?

PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907

当使用引号时,它就能像我预期的那样工作,那么为什么呢?它相当于 吗[0-9].*

PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

答案1

“文件名替换”或“路径名扩展”或“通配符”

当你输入一个命令时,它会经历几个阶段的潜在转换任何程序(例如 grep)都会被调用。

[在某些 shell 中是特殊字符。

$ echo [0-9]
7

我认为这里发生的事情是,shell 将 0-9 扩展为文件名选择,并找到您的“7”文件,因此将“7”传递给 grep。因此 grep 正在寻找文件名中任何位置包含“7”的文件名。

如果您希望[由 grep 处理而不是由 shell 处理,则必须用引号括住该字符串或欺骗 shell 以不同的方式解析表达式。

$ echo [0-9].
[0-9].

建议引用。

另请参阅man bash (查找for),man test以及第 151 页


常用表达

在正则表达式中,.表示“任何单个字符”。所以[0-9].表示任何数字后跟一个字符。文件名7缺少后者。


如果你希望 grep 查找单个数字文件名,你需要将表达式锚定到行的开始和结束处

$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

$ ls -1 | grep '^[0-9]$'
7

哎呀我把我的电脑弄坏了

不小心使用特殊字符会导致各种令人兴奋的结果

$ ls -1 > x
$ grep *
x:1184

如果你考虑一下,这应该会变得更加清晰

$ ls -1
1184
36
69929
7
9907
x

$ echo *
1184 36 69929 7 9907 x

现在只需添加rmsudo混合,您就可以获得可能极大地改变您的职业生涯的经历。

相关内容