繁体   English   中英

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

[英]Bash command to recursively list files but sorting by classification

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

find . -name '.svn' -prune -o -type f -print

今天,我想做类似的事情,但我也想影响列出目录内容的顺序:我希望'普通'文件后跟子目录(然后是递归内容)。 似乎没有这个选项。

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

现在,我可以编写一个Python脚本来完成我想要的操作。 但是, find几乎我想做的一切。 通常在Bash shell中,可以组合程序来做你想做的事情:每个程序,比如findsortuniqlswc ,执行一个简单的任务,但做得很好。 并非每个程序都需要能够排序,因为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用户,但我在Cygwin中运行Bash shell。)

谢谢。

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

find . -type d -exec find {} -type f -maxdepth 1 \;

这将首先对每个级别中的目录进行分组,然后将文件递归到每个级别并执行相同的操作:

ls -lR --group-directories-first

不过,它完全取决于你想要的东西。

tree -fi

在Ubuntu和CentOS(以及Red Hat,Fedora ......)上,它包含在自己的包中,名为“tree”(duh)。 默认情况下,Ubuntu似乎没有安装该软件包。

编辑:对不起,没有意识到你正在使用Cygwin。 好吧,它也被移植到Cygwin。 如果它不在默认设置中, 请参见此处

如果目录深度超过一级,你没有说明你想要处理的事情。 这样的事情能做到你想要的吗? 它执行广度优先列表,在每个深度级别内排序:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM