求Linux下指定层级目录的.txt文件名查找Bash命令
正确的Bash命令实现指定层级文件提取
要精准匹配你描述的目录层级并提取.txt文件名,推荐使用find命令结合正则匹配来确保层级和目录命名规则严格符合要求:
命令1(正则精准匹配)
find rawdata -type f -regextype posix-extended -regex '.*/rawdata/AB[^/]+/demo/[0-9]+/[^/]+\.txt' -printf '%f\n' > test.txt
参数说明:
-type f:仅匹配文件,避免把目录名混入结果-regextype posix-extended:启用扩展正则语法,支持+表示「一个或多个」字符-regex '.*/rawdata/AB[^/]+/demo/[0-9]+/[^/]+\.txt':AB[^/]+:确保二级目录以AB开头,且后续是任意非斜杠字符(严格限定为二级目录)[0-9]+:确保四级目录是纯数字且至少有一位,排除空目录或含非数字字符的目录[^/]+\.txt:匹配目标目录下的所有.txt文件
-printf '%f\n':仅输出文件名(不含完整路径)> test.txt:将结果写入test.txt文件
命令2(Bash glob方式,需开启globstar)
如果你的Bash版本支持(通常4.0+),可以用glob简化写法:
shopt -s globstar printf '%s\n' rawdata/AB*/demo/[0-9]*/.txt | xargs -n1 basename > test.txt
说明:
shopt -s globstar:开启递归glob匹配,让*可以精准对应固定层级的目录basename:提取每个文件的纯文件名,去掉路径前缀
原命令出错原因推测:
- 层级匹配不严格:比如使用了
rawdata/*/demo/*这类模糊匹配,导致非AB开头的二级目录、非纯数字的四级目录也被纳入 - 纯数字目录匹配错误:用了
*而非[0-9]+,无法过滤含非数字字符的目录 - 未限定只匹配文件:可能把目录名也混入了结果
内容的提问来源于stack exchange,提问作者Sally
相关产品推荐
相关产品推荐

