前言
根据文件的后缀进行筛选,如下:
有.rc
、.sql
、.txt
三种后缀文件,
如何筛选出:.sql
和 .txt
后缀的文件.
[root@localhost 20240620]# ll
total 0
-rw-r--r--. 1 root root 0 Jun 20 12:24 a.rc
-rw-r--r--. 1 root root 0 Jun 20 12:24 a.sql
-rw-r--r--. 1 root root 0 Jun 20 12:24 a.txt
[root@localhost 20240620]#
解决方法
这里详细解释一下使用 grep -E
和 bash
的扩展模式(extglob)的两种方法,包括示例。
使用 grep -E
和扩展正则表达式
grep -E
允许使用扩展正则表达式(ERE),它比基本正则表达式更强大。
步骤:
-
列出目录中的所有文件:
- 使用
ls
列出当前目录的所有文件,并将结果传递给grep
。
- 使用
-
使用
grep -E
过滤文件:grep -E 'a\.(sql|txt)$'
使用扩展正则表达式来匹配以.sql
或.txt
结尾的文件。a\.(sql|txt)$
中:a\.
匹配以a.
开头的字符串。(sql|txt)
匹配sql
或txt
。$
表示行尾,确保匹配的是文件后缀。
示例:
假设目录中有以下文件:
a.sql
a.txt
a.t
b.sql
b.txt
运行以下命令:
ls | grep -E 'a\.(sql|txt)$'
输出:
a.sql
a.txt
使用 bash
的扩展模式(extglob)
bash
的扩展模式(extglob)提供了一种简便的方法来匹配多个模式。需要先启用扩展模式,然后使用 ls
列出符合条件的文件。
步骤:
-
启用扩展模式:
- 使用
shopt -s extglob
启用bash
的扩展模式。
- 使用
-
使用扩展模式匹配文件:
ls a.@(sql|txt)
中:@(pattern-list)
匹配括号中的任意一个模式。a.@(sql|txt)
匹配a.sql
或a.txt
。
示例:
假设目录中有以下文件:
a.sql
a.txt
a.t
b.sql
b.txt
运行以下命令:
shopt -s extglob
ls a.@(sql|txt)
输出:
a.sql
a.txt
具体解释
使用 grep -E
:
ls | grep -E 'a\.(sql|txt)$'
-
ls
列出当前目录的所有文件:a.sql a.txt a.t b.sql b.txt
-
grep -E 'a\.(sql|txt)$'
过滤并匹配以.sql
或.txt
结尾的文件:a\.
匹配文件名以a.
开头。(sql|txt)
匹配文件后缀为sql
或txt
。$
确保匹配行尾,完整匹配文件名。
输出结果:
a.sql
a.txt
使用 bash
扩展模式:
shopt -s extglob
ls a.@(sql|txt)
-
shopt -s extglob
启用bash
的扩展模式。 -
ls a.@(sql|txt)
使用扩展模式匹配:a.
匹配文件名以a.
开头。@(sql|txt)
匹配文件后缀为sql
或txt
。
输出结果:
a.sql
a.txt
这两种方法都可以有效地筛选出 a.sql
和 a.txt
文件,各有优势,取决于你习惯使用的工具和命令组合。