You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用find或其他命令返回目录中无路径且非下划线开头的文件名?

实现只返回非下划线开头的文件名(不带路径)的bash方案

当然可以实现!下面给你几种实用的bash命令方案,完美满足你只返回不以下划线_开头的文件名(不带前置路径)的需求:

1. find + basename 组合(兼容多数场景)

这是你提到的结合basename的方案,通过find先匹配目标文件,再用basename剥离路径:

方式A:用find的-exec参数

find /your/target/path -type f ! -name "_*" -exec basename {} \;
  • -type f:只匹配文件(如果需要包含目录,去掉这个参数即可)
  • ! -name "_*":排除所有以下划线开头的文件/目录
  • -exec basename {} \;:对每个匹配到的路径执行basename命令,输出纯文件名

方式B:用xargs批量处理(更高效)

如果匹配的文件数量较多,xargs可以减少子进程创建的开销:

find /your/target/path -type f ! -name "_*" | xargs basename

注意:如果文件名包含空格、换行等特殊字符,建议用安全版:

find /your/target/path -type f ! -name "_*" -print0 | xargs -0 basename

2. find自带printf(最高效,无需额外命令)

其实find本身就支持直接输出文件名,不需要调用basename,效率更高:

find /your/target/path -type f ! -name "_*" -printf "%f\n"

这里的%f是find的内置格式符,专门用来输出不含路径的纯文件名,一步到位,推荐优先使用这个方案。

3. ls方案(仅适合当前目录,需注意局限性)

如果只需要处理当前目录下的文件,可以用bash的扩展glob配合ls:
首先确保开启扩展glob(如果没开的话):

shopt -s extglob

然后执行:

ls -1 !(_*)
  • -1:让ls每行输出一个文件名
  • !(_*):扩展语法,匹配所有不以下划线开头的文件

局限性:这个方法只能处理当前目录,无法递归搜索子目录;且如果文件名包含特殊字符(比如换行、空格),可能出现异常,所以仅推荐简单场景使用。

内容的提问来源于stack exchange,提问作者obidyne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:06:55