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

标签 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]
  [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

最佳答案

你不需要 ls 也不需要 grep 也不需要 awk 来获取树。简单的递归 bash 函数就够了,比如:

#!/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

关于linux - 使用 ls 递归打印完整目录树的 Shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43621880/

相关文章:

bash - 如何将多行连接成一个字符串

linux - 我可以在 awk 的不同代码块中使用不同的分隔符吗?

linux - 在文件夹中的 gzip 文件中查找字符串

php - Phalcon在Centos上安装报错: make: *** [phalcon. lo] Error 1

c++ - Linux C++应用程序中获取SCSI磁盘名称的方法

linux命令,从txt文件中输出具有特定范围内的数字的行

linux - 检索 `ls -la` 的符号链接(symbolic link)和目标链接

linux - 无法使用 pip 下载 mongo-connector

bash - 将 bash 替换为循环变量以获取数组名称

c# - 使用 .NET Core 在 Linux 中通过 "/bin/bash"执行 .sh(bash 脚本)文件