使用进行正常查找的结果find . ! -path "./build*" -name "*.txt"
:
./tool/001-sub.txt
./tool/000-main.txt
./zo/001-int.txt
./zo/id/002-and.txt
./as/002-mod.txt
以及何时排序sort -n
:
./as/002-mod.txt
./tool/000-main.txt
./tool/001-sub.txt
./zo/001-int.txt
./zo/id/002-and.txt
但是所需的输出是:
./tool/000-main.txt
./zo/001-int.txt
./tool/001-sub.txt
./zo/id/002-and.txt
./as/002-mod.txt
这意味着输出仅基于文件名排序,但是文件夹信息应作为输出的一部分进行维护。
编辑:使示例更加复杂,因为子目录结构可能包含多个层次。
您需要按最后一个字段排序(考虑/
为字段分隔符)。不幸的是,我想不出一个可以在字段数变化时执行此操作的工具(如果只能sort -k
取负值)。
为了解决这个问题,您必须做一个decorate-sort-unecorate。也就是说,将文件名放在开头,然后是字段分隔符,然后进行排序,然后删除第一列和字段分隔符。
find . ! -path "./build*" -name "*.txt" |\
awk -vFS=/ -vOFS=/ '{ print $NF,$0 }' |\
sort -n -t / |\
cut -f2- -d/
该awk
命令说字段分隔符 FS
设置为/
; 这会影响它读取字段的方式。在输出字段分隔符 OFS
也被设置为/
; 这会影响其打印记录的方式。下一条语句表示打印最后一列(NF
是记录中的字段数,因此它也恰好是最后一个字段的索引)以及整个记录($0
是整个记录);它将使用它们之间的OFS打印它们。然后sort
编辑该列表,将其/
视为字段分隔符-由于我们在记录中首先拥有文件名,因此它将以此排序。然后cut
仅打印到最后的字段2,再次将其/
视为字段分隔符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句