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