如何用find命令先按顺序列目录,再列出同深度文件?
实现按深度逆序+同深度路径正序的文件列表
当然可以实现你的需求,不过单纯用find本身没法完成这种自定义排序,需要结合sort工具来调整输出顺序。
问题分析
你当前的命令find -type f -printf "%d %p\n" | sort -nr是按深度数字逆序排序,但同一深度下的路径会按字符串逆序排列(所以xtest会排在test2、test1前面),这和你期望的同深度路径升序不符。
解决方案
我们需要调整sort的参数,让它先按深度逆序排序,再对同一深度的路径按字典序正序排序。最终命令如下:
find -type f -printf "%d\t%p\n" | sort -k1,1nr -k2,2 | cut -f2-
命令拆解:
find -type f -printf "%d\t%p\n":- 遍历所有文件(
-type f),输出格式为「文件深度 + 制表符 + 文件路径」,每行一个结果。
- 遍历所有文件(
sort -k1,1nr -k2,2:-k1,1nr:对第1个字段(深度值)按数字逆序排序,确保子目录中的文件(深度更大)排在前面。-k2,2:对第2个字段(文件路径)按字典序正序排序,让同深度的路径按test1→test2→xtest的顺序排列。
cut -f2-:- 去掉输出中的第一个字段(深度值),只保留最终的文件路径。
执行这个命令后,就能得到你期望的输出:
test/test1/1.txt test/test2/1.txt test/xtest/1.txt test/test.txt
如果你想要一行输出所有路径,可以再追加tr '\n' ' ':
find -type f -printf "%d\t%p\n" | sort -k1,1nr -k2,2 | cut -f2- | tr '\n' ' '
补充说明
find本身的遍历顺序由文件系统决定(通常是目录项的存储顺序),没有内置的自定义排序功能,所以必须借助sort这类工具来实现复杂排序需求。
内容的提问来源于stack exchange,提问作者Alessandro
相关产品推荐
相关产品推荐

