【问题标题】:Bash command to recursively list files but sorting by classification用于递归列出文件但按分类排序的 Bash 命令
【发布时间】: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 中,可以组合程序来做你想做的事情:每个程序,比如 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。)

谢谢。

【问题讨论】:

    标签: bash sorting find


    【解决方案1】:

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

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

    【讨论】:

    • 这可行,但会发出警告。它们可以通过-nowarn 选项关闭。
    • 谢谢!我认为这可能会以某种方式实现。因此,我的 SVN 过滤示例将是 find 。 -name '.svn' -prune -o -type d -exec find {} -type f -nowarn -maxdepth 1 \;
    • 当我尝试这个时,结果是未排序的(按目录和目录级别)。
    【解决方案2】:
    tree -fi
    

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

    编辑:抱歉,没有意识到您正在使用 Cygwin。好吧,它也被移植到 Cygwin。如果不在默认设置中,see here

    【讨论】:

    • 您也可以添加-a 来获取隐藏文件。
    【解决方案3】:

    如果目录的深度超过一级,您没有说明您希望如何处理事情。像这样的东西可以满足您的需求吗?它执行广度优先列表,在每个深度级别内排序:

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

    【讨论】:

    • 这很难表达,所以我试图在示例中说明这一点。我想要所有文件,然后是所有目录(这很容易)。在给定目录中,我想首先列出文件,然后处理每个子目录,依次递归到每个子目录。
    【解决方案4】:

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

    ls -lR --group-directories-first
    

    不过,这与你想要的完全相反。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-30
      • 2010-12-10
      • 2016-06-10
      • 2011-12-25
      • 2011-08-23
      • 2016-09-07
      • 2017-01-06
      相关资源
      最近更新 更多