【问题标题】:Listing only directories in UNIX仅列出 UNIX 中的目录
【发布时间】:2010-09-08 11:42:41
【问题描述】:

我只想列出指定路径中的目录(ls 没有这样的选项)。 另外,这可以用单行命令完成吗?

【问题讨论】:

标签: unix shell


【解决方案1】:

试试这个ls -d */ 列出当前目录中的目录

【讨论】:

  • 嘿,这很漂亮,我一直习惯我们ls -al | grep '^d' - 这更简洁。
  • 为什么使用 */ ??请解释一下!?
  • 我没有正确的解释,但是我知道*/ 强制仅显示以正斜杠结尾的项目,在这种情况下,这将是一个目录,即使未使用 ls-F 选项。类似于ls *php 的行为以及它如何显示目录中所有以php 结尾的文件。
  • @user975234 有人问过类似的问题,link@
  • echo */ 也会这样做
【解决方案2】:

试试这个:

find . -maxdepth 1 -type d

【讨论】:

  • 对我来说,这看起来应该是这样做的。与建议的ls 解决方案不同,find 完全负责完成这项工作(不依赖外壳通配符扩展,这可能会施加限制)。它也更加简洁。
  • 这样做的坏处是,如果您尝试遍历结果并且结果名称中有空格,则它不起作用。
  • 或者,如果您不想包含目录本身:find * -maxdepth 0 -type d
  • @ubiquibacon 使用find-print0-exec 选项。
  • 这真的很慢,至少在我的 Mac 上是这样。它似乎执行了 find 通常执行的完整递归搜索,但仅输出深度为 1 的文件夹。
【解决方案3】:

以下

find * -maxdepth 0 -type d

基本上通过-type d 条件过滤“*”的扩展,即当前目录中的所有条目。

优点是,输出与ls -1 * 相同,但只有目录 并且条目不以点开头

【讨论】:

    【解决方案4】:

    您可以使用ls -d */tree -d

    另一种解决方案是通配,但这取决于您使用的 shell 以及是否支持对目录进行通配。

    例如 ZSH:

    zsh # ls *(/)
    

    【讨论】:

    • tree 是哪一种 Unix?
    • 所有主要的 linux distries 例如?抱歉,我没听懂?
    • 我有一个 Debian 发行版,默认情况下没有安装 tree(尽管它在存储库中)。
    • 投反对票,因为我相信 tree 命令不是原生 unix 命令(如果我错了,请纠正我)。
    【解决方案5】:
    ls -l | grep '^d'
    

    您可以创建一个别名并将其放入配置文件中

    alias ld="ls -l| grep '^d'"
    

    【讨论】:

    • 使用此命令不查看链接。链接可以是文件或目录。示例:lrwxrwxrwx 1 root root 21 avril 15 17:38 cron -> /lib/init/upstart-job.
    【解决方案6】:

    由于有几十种方法可以做到,这里有另一种:

    tree -d -L 1 -i --noreport
    
    • -d:目录
    • -L:树的深度(因此为 1,我们的工作目录)
    • -i:无缩进,仅打印名称
    • --noreport:不在树列表末尾报告信息

    【讨论】:

    • 感谢您解释开关。 Stack Overflow 是关于答案的,我总是很感激人们喜欢你的解释而不是“只阅读 man 条目!”
    • 从第 2 行开始(跳过只有一个点的行):tree -d -L 1 -i --noreport | tail -n +2
    • 这是列出软链接目录的排名最高的解决方案,并且以一种有用的方式这样做,将它们作为链接公开。我更喜欢这种变化:tree -C -d -L 1 -i --noreport | tail -n+2
    【解决方案7】:
    find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
    

    【讨论】:

    • ☀ 找到 . -maxdepth 1 -type d -name [^\.]* | sed 's:^\./::' zsh: 未找到匹配项:[^.]*
    【解决方案8】:

    使用它来获取目录列表

    ls -d */ | sed -e "s/\///g"
    

    【讨论】:

    • ls -d | sed -e "s/\///g" 不工作..有什么线索吗?
    • 谢谢!我只想要没有所有权限的目录列表,这就成功了。 :)
    【解决方案9】:

    答案取决于你的shell

    例如,在zsh 中,您可以执行以下操作:

    echo *(/)
    

    并且会显示当前工作目录中的所有目录。

    更多信息请参见man zshexpn

    另一种方法是使用find(1),它应该适用于大多数 Unix 风格:

    find . -maxdepth 1 -type d -print  
    

    find(1) 有很多用途,所以我绝对推荐man find

    【讨论】:

      【解决方案10】:

      为了列出当前工作目录中的目录 可以使用ls -d */。 如果您需要列出隐藏目录,请使用此命令 ls -d .*/

      【讨论】:

        【解决方案11】:

        find specifiedpath -type d

        如果你不想在子目录中递归,你可以这样做:

        find specifiedpath -type d -mindepth 1 -maxdepth 1

        请注意,“点”目录(名称以. 开头)也会被列出;但不是特殊目录. 也不是..。如果你不想要“点”目录,你可以grep 他们出来:

        find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'

        【讨论】:

        • 支持提及mindepth 以摆脱.! ?
        【解决方案12】:

        您可以使用带有d 开关的tree 命令来完成此操作。

        % tree -d tstdir
        tstdir
        |-- d1
        |   `-- d11
        |       `-- d111
        `-- d2
            `-- d21
                `-- d211
        
        6 directories
        

        请参阅man tree 了解更多信息。

        【讨论】:

        • 我没有投反对票,只是有同样的问题。看来你的答案是 echox 的骗子,也许这就是为什么?。
        • @Louis - 谢谢我从来没有注意到他提到tree。哦,好吧,我不是有意偷走任何人的风头。
        • 支持可视化树的作用
        • 我相信反对票是因为它与stackoverflow.com/a/3667405/523742的答案相同
        • @TiagoCardoso - 我的比那个早 2 年。
        【解决方案13】:

        目录列表

        ls -l | grep  '^d'  
        

        列出目录

        ls -d */
        

        【讨论】:

        • 您是否有充分的理由重复已有的答案?
        【解决方案14】:

        如果我有这个目录:

        ls -l

        lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
        -rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
        -rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
        -rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
        drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp
        

        要获取所有目录,请使用 -L 解析链接:

        ls -lL | grep '^d'

        drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
        drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp
        

        没有 -L:

        ls -l | grep '^d'

        drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp
        

        conf_nagios 目录丢失。

        【讨论】:

          【解决方案15】:
          ### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
          find $(pwd) -maxdepth 1 -type d -name "SL*"
          

          【讨论】:

            【解决方案16】:

            在 bash 中:

            ls -d */
            

            将列出所有目录

            ls -ld */
            

            将以长格式列出所有目录

            ls -ld */ .*/
            

            将以长格式列出所有目录,包括隐藏目录。


            我最近切换到 zsh (MacOS Catalina),发现:

            ls -ld */ .*/
            

            不再工作如果当前目录不包含隐藏目录。

            zsh: no matches found: .*/
            

            它会打印上述错误,但也将无法打印任何目录。

            ls -ld *(/) .*(/)
            

            同样失败。

            到目前为止,我发现:

            ls -ld */;ls -ld .*/
            

            是一个不错的解决方法。 ; 是命令分隔符。但这意味着如果没有隐藏目录,它会列出目录,并且仍然打印没有隐藏目录的错误:

            foo
            bar
            zsh: no matches found: .*/
            

            ls 是用于列出当前目录内容的 shell 命令
            -l 是指定要在 Longford 中列出的标志(每行一个项目 + 一堆其他很酷的信息)
            -d 是将所有目录“作为文件”而不是递归列出的标志
            */ 是参数“列出所有以斜线结尾的文件”
            * 是“任何东西”的简单正则表达式命令,所以*/ 要求外壳列出“以'/'结尾的任何内容”

            更多信息请参见man ls


            我把这个:

            alias lad="ls -ld */;ls -ld .*/"

            在我的 .zshrc 中,它似乎工作正常。

            注意:我也发现了

            ls -ld .*/ 2> /dev/null

            不起作用,因为它仍然将 sterr 打印到终端。如果/当我找到解决方案时,我会更新我的答案。

            【讨论】:

              【解决方案17】:

              这是另一个显示链接目录的解决方案。 我稍微喜欢它,因为它是“正常” ls -l 输出的子集:

              ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always
              

              【讨论】:

                【解决方案18】:

                我发现前面列出了很多好的答案。但是我想添加一个我们已经使用过几次的命令,这样很容易列出所有目录:

                cd

                (注意:cd后留个空格)按两次tab键,只会列出当前工作目录下的所有目录。希望这个好用。请让我知道这是否有任何问题。谢谢。

                【讨论】:

                  【解决方案19】:

                  这是大多数人想要的答案。

                  ls -l | grep -E '^d' | awk '{print $9}'
                  

                  目录名,只有目录名。

                  【讨论】:

                    【解决方案20】:

                    这一直对我有用:

                    ls -F | grep /
                    

                    (但是,我正在切换到@nos 提到的echo */

                    【讨论】:

                      【解决方案21】:

                      du -d1 可能是最短的选择。 (只要您不需要将输入通过管道传递给另一个命令。)

                      【讨论】:

                        【解决方案22】:

                        要仅列出指定路径中的目录,只需键入

                        ls -l | grep drw
                        

                        【讨论】:

                        • 这可能包括文件,如果任何文件名包含drw,并且将排除任何不是所有者可读和不可写的目录。 grep ^d 效果更好。
                        猜你喜欢
                        • 2016-02-11
                        • 2011-07-16
                        • 2019-06-03
                        • 2012-01-31
                        • 1970-01-01
                        • 2016-11-04
                        • 2011-06-29
                        • 2016-03-15
                        • 1970-01-01
                        相关资源
                        最近更新 更多