Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用ls递归打印完整目录树的Shell脚本_Linux_Bash_Shell_Awk_Grep - Fatal编程技术网

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

Linux 使用ls递归打印完整目录树的Shell脚本,linux,bash,shell,awk,grep,Linux,Bash,Shell,Awk,Grep,分配:我必须使用diff和sort创建一个shell脚本,并使用ls-l、grep“^d”和awk“{print$9}”创建一个管道来打印完整的目录树 我写了一个C程序来显示我要找的东西。以下是输出: ryan@chrx:~/Documents/OS-Projects/Project5_DirectoryTree$ ./a.out TestRoot/ [Folder1] [FolderC] [FolderB] [FolderA] [Folder2] [FolderD] [F

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

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

ryan@chrx:~/Documents/OS-Projects/Project5_DirectoryTree$ ./a.out 
TestRoot/
[Folder1]
  [FolderC]
  [FolderB]
  [FolderA]
[Folder2]
  [FolderD]
  [FolderF]
  [FolderE]
[Folder3]
  [FolderI]
  [FolderG]
  [FolderH]
到目前为止,我写了以下内容:

ls -R -l $1 | grep '^d' | awk '{print $9}' 
打印目录树,但现在我需要一种方法来排序,它的文件夹深度和可能的缩进,但不是必需的。有什么建议吗?我无法使用“查找”或“树”命令

编辑:原始分配和限制错误,并在以后更改。如果您无视这些限制,当前的答案是很好的解决方案,因此请将它们留给任何有类似问题的人。至于新的任务,以防有人怀疑。我要递归地打印所有子目录,对它们进行排序,然后将它们与我的程序进行比较,以确保它们具有相似的结果。以下是我的解决方案:

#!/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
#/bin/bash
回声程序:
./a.出$1 |种
echo Shell脚本:
ls-R-l$1 | grep'^d'| awk'{print$9}'排序

diff获取树既不需要
ls
也不需要
grep
也不需要
awk
。简单的递归
bash
函数将是enouh,如:

#!/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
的形式运行,它将打印目录树,如下所示:

/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

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

$ 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]

很抱歉,我找不到一个合理的方法来使用您提到的其他工具,因此它可能对您没有帮助,但可能会帮助其他人解决相同的问题,但不需要使用特定的工具。

当您使用awk时,您永远不需要grep,因为awk可以做任何grep可以做的有用的事情(例如,
grep'^d'| awk'{print$9}'
=
awk'/^d/{print$9}'
),递归查找目录的工具是
find-type d
,而不是
ls-R
,这与diff或sort有什么关系?我理解。限制、差异和排序只是给定赋值的一部分。如果可以的话,我会写很多不同的剧本。但是你会有什么不同,比如说?你可以在脚本中的某个地方加入一个
diff/etc/password/dev/null>/dev/null
,只是为了使用
diff
,我怀疑你是否会因此得到任何分数,但我无法想象你在这个问题上会使用diff做什么。我知道的没错。我的教授对这一点的描述甚至对我来说都毫无意义。这就是我在这里问的原因。不过我想在这件事上和报纸唱反调。至少我知道我没有疯。这个脚本需要是一行吗?你的解决方案很酷,但原始帖子提出了以下要求:我必须使用diff和sort创建一个shell脚本,并使用ls-l、grep“^d”和awk“{print$9}”创建一个管道来打印完整的目录树。@RogerSinasohn,如果不考虑限制,这是一个很好的解决原始问题的方法。我添加了一个编辑,解释作业描述不正确,并添加了我的解决方案。同意。仍然有用!非常感谢。