Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Bash命令递归列出文件,但按分类排序_Bash_Sorting_Find - Fatal编程技术网

Bash命令递归列出文件,但按分类排序

Bash命令递归列出文件,但按分类排序,bash,sorting,find,Bash,Sorting,Find,我经常使用Bash中的优秀程序列出带有特定过滤器的文件。例如,在Subversion(SVN)工作副本中,我有时希望递归列出所有文件,但不包括.SVN子目录,如下所示: find . -name '.svn' -prune -o -type f -print 今天,我想做一些类似的事情,但我还想影响目录内容的列出顺序:我希望“普通”文件后面跟着子目录(然后是递归内容)。似乎没有此选项 (list)命令有一个递归列出的选项。此命令有许多排序选项,包括按文件名、访问时间、大小等列出,但不包括分类,

我经常使用Bash中的优秀程序列出带有特定过滤器的文件。例如,在Subversion(SVN)工作副本中,我有时希望递归列出所有文件,但不包括
.SVN
子目录,如下所示:

find . -name '.svn' -prune -o -type f -print
今天,我想做一些类似的事情,但我还想影响目录内容的列出顺序:我希望“普通”文件后面跟着子目录(然后是递归内容)。似乎没有此选项

(list)命令有一个递归列出的选项。此命令有许多排序选项,包括按文件名、访问时间、大小等列出,但不包括分类,尽管
-p
选项将注释目录

现在,我可以编写一个Python脚本来完成我想做的事情。然而,
find
几乎已经完成了我想要的一切。通常在bashshell中,可以组合程序来完成您想要的任务:每个程序,如
find
sort
uniq
ls
wc
,执行一个简单的任务,但效果很好。并非每个程序都需要能够排序,因为
sort
可以排序。所以,真的,我只是好奇

我的问题是,你知道有没有一种方法可以满足我的要求:只需结合Bash程序,即可对递归文件列表进行过滤和排序?

例如,
find
按以下字母顺序提供文件:

a.txt
b\file1.txt
b\subdir\file2.txt
b\then_file3.txt
c.txt
d\file4.txt
e.txt
但我更喜欢这样的顺序,在每个目录中,普通文件按字母顺序排列在第一位,然后是目录,再次按字母顺序排列:

a.txt
c.txt
e.txt
b\file1.txt
b\then_file3.txt
b\subdir\file2.txt
d\file4.txt
(我是Windows用户,但在中运行Bash shell。)


谢谢。

使用嵌入式查找。外部查找查找所有目录并执行内部查找,该查找仅显示该目录中所需的文件:

find . -type d -exec find {} -type f -maxdepth 1 \;
在Ubuntu和CentOS(以及红帽、Fedora…)上,它包含在自己的包中,称为“树”(duh)。Ubuntu在默认情况下似乎并没有安装这个软件包,其他的都安装了


对不起,我没意识到你在用Cygwin。嗯,它也被移植到了Cygwin。如果不在默认设置中,.

如果目录的深度超过一级,您没有说明要如何处理。像这样的东西能满足你的需要吗?它以广度优先的方式列出,在每个深度级别内进行排序:

$for ((l = 0; l <= 24; l++)); do find . -mindepth ${l} -maxdepth ${l} -type f | sort; done

$for((l=0;l这将首先对每个级别内的目录进行分组,然后对文件进行分组,并递归到每个级别,执行相同的操作:

ls -lR --group-directories-first

虽然它与您想要的完全相反。

这是可行的,但会发出警告。它们可能会被
-nowarn
选项关闭。谢谢!我认为这可能是有可能的。因此,我的SVN过滤示例是find.-name'.SVN'-prune-o-typed-exec find{}-键入f-nowarn-maxdepth 1\;当我尝试此操作时,结果是未排序的(按目录和在目录级别内)。这很难表达,因此我尝试在示例中说明这一点。我不需要所有文件,然后是所有目录(这很简单)。在给定目录下,我希望首先列出文件,然后处理每个子目录,依次递归到每个子目录。您也可以添加
-a
来获取隐藏的文件。
ls -lR --group-directories-first