作业:我必须使用 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/