首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ls递归地打印完整目录树的Shell脚本

使用ls递归地打印完整目录树的Shell脚本
EN

Stack Overflow用户
提问于 2017-04-25 22:13:23
回答 2查看 2.3K关注 0票数 1

分配:我必须使用diff和sort创建一个shell脚本,并使用ls -l、grep '^d‘和awk '{print $9}’创建一个管道来打印完整的目录树。

我写了一个C程序来显示我想要的东西。这是输出:

代码语言:javascript
复制
ryan@chrx:~/Documents/OS-Projects/Project5_DirectoryTree$ ./a.out 
TestRoot/
[Folder1]
  [FolderC]
  [FolderB]
  [FolderA]
[Folder2]
  [FolderD]
  [FolderF]
  [FolderE]
[Folder3]
  [FolderI]
  [FolderG]
  [FolderH]

到目前为止,我写了这个:

代码语言:javascript
复制
ls -R -l $1 | grep '^d' | awk '{print $9}' 

要打印目录树,现在我需要一种按文件夹深度排序的方法,可能还需要缩进,但不是必需的。有什么建议吗?我不能使用查找或树命令。

编辑:原来的分配和限制是错误的,并在稍后的日期改变。目前的答案是很好的解决办法,如果你无视这些限制,所以请留给任何有类似问题的人。至于新的任务,万一有人想知道。我要递归地打印所有子目录,对它们进行排序,然后将它们与我的程序进行比较,以确保它们具有相似的结果。这是我的解决方案:

代码语言:javascript
复制
#!/bin/bash
echo Program:
./a.out $1 | sort
echo Shell Script:
ls -R -l $1 | grep '^d' | awk '{print $9}' | sort

diff <(./a.out $1 | sort) <(ls -R -l $1 | grep '^d' | awk '{print $9}' | sort)
DIFF=$?

if [[ $DIFF -eq 0 ]]
then
    echo "The outputs are similar!"
fi
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-25 23:01:28

您不需要lsgrepawk来获得树。简单的递归bash函数将是enouh,类似于:

代码语言:javascript
复制
#!/bin/bash
walk() {
        local indent="${2:-0}"
        printf "%*s%s\n" $indent '' "$1"
        for entry in "$1"/*; do
                [[ -d "$entry" ]] && walk "$entry" $((indent+4))
        done
}
walk "$1"

如果以bash script.sh /etc的形式运行它,它将打印如下所示的dir树:

代码语言:javascript
复制
/etc
    /etc/apache2
        /etc/apache2/extra
        /etc/apache2/original
            /etc/apache2/original/extra
        /etc/apache2/other
        /etc/apache2/users
    /etc/asl
    /etc/cups
        /etc/cups/certs
        /etc/cups/interfaces
        /etc/cups/ppd
    /etc/defaults
    /etc/emond.d
        /etc/emond.d/rules
    /etc/mach_init.d
    /etc/mach_init_per_login_session.d
    /etc/mach_init_per_user.d
    /etc/manpaths.d
    /etc/newsyslog.d
    /etc/openldap
        /etc/openldap/schema
    /etc/pam.d
    /etc/paths.d
    /etc/periodic
        /etc/periodic/daily
        /etc/periodic/monthly
        /etc/periodic/weekly
    /etc/pf.anchors
    /etc/postfix
        /etc/postfix/postfix-files.d
    /etc/ppp
    /etc/racoon
    /etc/security
    /etc/snmp
    /etc/ssh
    /etc/ssl
        /etc/ssl/certs
    /etc/sudoers.d
票数 2
EN

Stack Overflow用户

发布于 2017-04-25 23:13:35

借用@ it 666在/etc上运行它的想法:

代码语言:javascript
复制
$ find /etc -type d -print | awk -F'/' '{printf "%*s[%s]\n", 4*(NF-2), "", $0}'
[/etc]
    [/etc/alternatives]
    [/etc/bash_completion.d]
    [/etc/defaults]
        [/etc/defaults/etc]
            [/etc/defaults/etc/pki]
                [/etc/defaults/etc/pki/ca-trust]
                [/etc/defaults/etc/pki/nssdb]
            [/etc/defaults/etc/profile.d]
            [/etc/defaults/etc/skel]
    [/etc/fonts]
        [/etc/fonts/conf.d]
    [/etc/fstab.d]
    [/etc/ImageMagick]
    [/etc/ImageMagick-6]
    [/etc/pango]
    [/etc/pkcs11]
    [/etc/pki]
        [/etc/pki/ca-trust]
            [/etc/pki/ca-trust/extracted]
                [/etc/pki/ca-trust/extracted/java]
                [/etc/pki/ca-trust/extracted/openssl]
                [/etc/pki/ca-trust/extracted/pem]
            [/etc/pki/ca-trust/source]
                [/etc/pki/ca-trust/source/anchors]
                [/etc/pki/ca-trust/source/blacklist]
        [/etc/pki/nssdb]
        [/etc/pki/tls]
    [/etc/postinstall]
    [/etc/preremove]
    [/etc/profile.d]
    [/etc/sasl2]
    [/etc/setup]
    [/etc/skel]
    [/etc/ssl]
    [/etc/texmf]
        [/etc/texmf/tlmgr]
        [/etc/texmf/web2c]
    [/etc/xml]

对不起,我找不到一种合理的方法来使用你提到的其他工具,所以它可能帮不了你,但也许它可以帮助其他有同样问题的人,但不需要使用特定的工具。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43621880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档