[英]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中,可以组合程序来做你想做的事情:每个程序,比如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用户,但我在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.