Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 排序“;查找“;按子目录之前的父目录_Linux_Bash_Shell - Fatal编程技术网

Linux 排序“;查找“;按子目录之前的父目录

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 -

我需要在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 -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