Linux下如何列出除指定文件外的所有文件?含排除1_开头文件场景
我来帮你梳理几种在Linux下实现这类需求的实用方法,分通用场景和你提到的具体情况逐一说明:
一、通用场景:排除少数指定文件列出所有文件
如果只是需要排除几个明确的文件名,或者某一类模式的文件,下面这些方法都能轻松搞定:
ls + grep 反向匹配:这是最直观的组合方式,利用
grep -v做反向过滤。比如要排除file1.txt和file2.log,可以用:ls | grep -vE "(file1.txt|file2.log)"其中
-E启用扩展正则表达式,方便同时匹配多个目标。find命令(更灵活的递归/非递归选择):如果需要更精细的控制(比如只找文件、不递归子目录),find是更好的选择。比如当前目录下排除
temp.csv:find . -maxdepth 1 -type f ! -name "temp.csv"要是排除多个文件,就用括号组合条件(记得转义):
find . -maxdepth 1 -type f ! \( -name "a.txt" -o -name "b.jpg" \)Bash扩展Glob(原生简洁写法):先开启Bash的扩展glob功能(默认可能没开):
shopt -s extglob之后就能用
!()语法排除指定模式,比如排除doc*和pdf*开头的文件:ls !(doc*|pdf*)这种写法不需要管道,运行效率更高。
二、具体场景:列出所有不以1_开头的文件
针对你提到的目录里有1_1.xyt、1_2.xyt、2_1.xyt这类文件,要筛选出不以1_开头的内容,推荐这几种简便方法:
方法1:ls + grep快速过滤
直接用正则匹配行首排除1_:
ls | grep -v "^1_"
解释:^表示匹配文件名的开头,-v表示反向选择,也就是把所有以1_开头的文件名排除掉。
方法2:find命令精准控制
如果需要区分文件和目录,或者避免递归子目录,用find更稳妥:
find . -maxdepth 1 ! -name "1_*"
要是只想列出文件(不包括目录),加上-type f:
find . -maxdepth 1 -type f ! -name "1_*"
方法3:Bash扩展Glob简洁写法
先确保开启了扩展glob(前面提过的shopt -s extglob),然后直接执行:
ls !(1_*)
这个命令会直接列出当前目录下所有不匹配1_*模式的内容,非常清爽。
方法4:Zsh用户专属简化
如果你用的是Zsh,它默认支持反向匹配,不用额外配置,直接用:
ls ^1_*
^符号在这里就代表反向匹配,简单直白。
内容的提问来源于stack exchange,提问作者Venkata S S K M Chaitanya

