Linux 排序“;查找“;按子目录之前的父目录
我需要在Temp文件夹的所有子目录中找到所有文本文件,我一直在使用:Linux 排序“;查找“;按子目录之前的父目录,linux,bash,shell,Linux,Bash,Shell,我需要在Temp文件夹的所有子目录中找到所有文本文件,我一直在使用: find Temp/ -name *.txt | sort 但我需要它在子目录之前按父文件夹排序。 这意味着如果我有两个文件Temp/1/a.txt,它会显示在Temp/z.txt之前,但我需要它。 我怎样才能做到这一点?您可以按斜杠的数量进行排序 find Temp/ -name '*.txt' \ | perl -pe 'print tr{/}{}, "\t"' \ | LC_ALL=C sort -
find Temp/ -name *.txt | sort
但我需要它在子目录之前按父文件夹排序。
这意味着如果我有两个文件Temp/1/a.txt
,它会显示在Temp/z.txt
之前,但我需要它。
我怎样才能做到这一点?您可以按斜杠的数量进行排序
find Temp/ -name '*.txt' \
| perl -pe 'print tr{/}{}, "\t"' \
| LC_ALL=C sort -k1,1n -k2 \
| cut -f2-
tr
运算符返回匹配数,即Perl中字符串中的斜杠数
排序
然后对行进行数字排序,然后剪切
删除每行的数字。您也可以使用AWK gsub执行此操作:
find Temp/-name*.txt | awk'{print gsub(/\/,“/”)“|”“$0;}”| sort-t'.'-k1,1n-k2 | sed's/^[^ |]*./'
gsub函数返回“/”替换的数量,指示每个条目的路径深度(不是很完美,但它应该足以满足您的需要)。我们使用它首先按深度顺序对路径进行排序,然后按字母顺序对路径进行排序,并使用sed删除路径深度
编辑:如果您需要先按父文件夹顺序再按深度顺序再按字母顺序排序,请参考:
find Temp/-name*.txt\
|awk“{parent=$0;gsub(/\/[^\/]*$/,”,parent);depth=gsub(/\/,“/”,$0);打印parent“|”depth“|”|“$0;}”\
|排序-t'|'-k1-k2,2n-k3\
|sed的/^[^ |]*.[^ |]*.//
在这里,AWK输出父文件夹后跟一个管道分隔符和路径深度,另一个管道分隔符和完整路径。然后我们简单地进行排序,并使用sed删除父文件夹和深度。给定:
$ tree .
.
├── 1
│ └── a.txt
├── a.txt
└── z.txt
您可以使用带有ruby的管道,根据1)计数/
和2)文件名进行双键排序:
find . -name '*.txt' \
| ruby -e 'fs=$<.readlines.sort_by{|f| [-f.count("/"), f[/[^\/]+$/]]} ; END{puts fs.join("")}'
我试过sort-n和sort-V-k1都没用谢谢!如果我在top@Nameles36:True,在排序之前添加它就足够了。
1 directory, 3 files
./1/a.txt
./a.txt
./z.txt