在Linux或Unix系统中,ls
命令本身没有直接的参数支持显示条件的取反结果(例如显示“不匹配”某个模式的文件)。但可以通过结合其他命令或技巧实现类似功能。
以下是几种常见方法:
使用find
命令配合-not
或!
find
命令更灵活,支持逻辑取反操作:
find . -maxdepth 1 -type f ! -name "*.txt" # 显示当前目录下非.txt文件
-maxdepth 1
限制只搜索当前目录,-type f
限定为文件,!
表示取反。
结合grep
过滤
通过管道将ls
结果传递给grep -v
(反向匹配):
ls | grep -v "pattern" # 显示不包含"pattern"的文件名
需注意:grep -v
会匹配所有输出行,包括隐藏文件(如果ls -a
被使用)。
使用extglob
扩展模式(Bash)
启用Bash的extglob
功能后,可以使用复杂模式匹配:
shopt -s extglob
ls !(*.txt) # 显示所有非.txt文件
此方法仅适用于Bash,且需提前开启extglob
选项。
使用ls
结合--ignore
(部分版本)
某些ls
实现(如GNU coreutils)支持--ignore
参数:
ls --ignore="*.txt" # 忽略.txt文件
但并非所有系统都支持该参数,需测试兼容性。
注意事项
- 隐藏文件(以
.
开头的文件)默认不被ls
显示,需加-a
参数。 - 文件名含空格或特殊字符时,建议用
find -print0
或ls -q
处理。 - 若需递归操作,优先使用
find
而非ls
。
想匹配当前目录下“非 .c结尾”的文件
ls *.c可以匹配到所有以*.c结尾的文件,取反操作可以通过一下命令实现:
bash中执行shopt -s extglob命令设定
在执行 ls !(*.c)
shopt是shell内建命令,来控制bash的行为。