如何按文件名而非完整路径对find命令输出按字母排序
按文件名(而非完整路径)对find结果排序的解决方案
我来帮你搞定这个需求!你想要的是把find找到的txt文件**仅按最后的文件名(basename)**进行字母排序,同时保留完整路径输出对吧?之前你试的几个命令没达到效果,是因为它们要么按数字排序,要么按时间/完整路径排序,没抓住“按文件名”这个核心。
核心思路
我们需要先把每个文件的文件名和完整路径分离开,按文件名排序后,再把完整路径提取出来。这里给你几个实用的命令:
方法1:awk+sort组合(最通用,无需额外工具)
find . -type f -name '*.txt' | awk -F/ '{print $NF "\t" $0}' | sort -k1,1 | cut -f2-
分步解释:
find . -type f -name '*.txt':找出当前目录下所有txt格式的文件,输出完整路径awk -F/ '{print $NF "\t" $0}':用/作为分隔符,把每个路径的最后一段(也就是文件名$NF)和完整路径用制表符分开输出sort -k1,1:仅按第一个字段(文件名)进行字母排序cut -f2-:去掉前面的文件名部分,只保留完整路径
方法2:支持带空格文件名的安全版本
如果你的文件名里可能包含空格或特殊字符,用-print0和xargs -0来处理更稳妥:
find . -type f -name '*.txt' -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(basename {})" "{}"' | sort -k1,1 | cut -f2-
这个版本用basename命令提取文件名,配合printf用制表符分隔,避免空格导致的排序错误。
为什么你之前的命令没生效?
find . -type f -name '*.txt' -print0 | sort -t:这个命令不完整,sort -t需要指定分隔符,而且没告诉sort按哪个字段排,自然不对find . -name '*.txt' -exec ls -ltu {} \; | sort -n:ls -ltu是按访问时间排序,和文件名完全无关,后续的sort -n也是按数字排序,不符合需求find . -name '*.txt' | sort -n:sort -n是按数字值排序,而你需要的是字母排序,而且这个命令是按完整路径的字符串排序,不是按单独的文件名
验证结果
用你给出的四个文件测试,上面的命令会输出:
./z/path/with/more/a.txt ./d/meanwhile/in/b.txt ./meanwhile/c.txt ./d/mored/dddd/d.txt
完全符合你的期望!
内容的提问来源于stack exchange,提问作者MeanwhileInHell
相关产品推荐
相关产品推荐

