【发布时间】:2010-12-13 15:28:59
【问题描述】:
我经常在 Bash 中使用出色的 find 程序来列出带有某些过滤器的文件。例如,在 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。)
谢谢。
【问题讨论】: