如何用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
相关产品推荐
相关产品推荐

