【发布时间】:2017-04-25 22:13:23
【问题描述】:
作业:我必须使用 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}'
要打印目录树,但现在我需要一种按文件夹深度和可能缩进但不是必需的方式对其进行排序。有什么建议么?我不能使用 find 或 tree 命令。
编辑:最初的分配和限制是错误的,并在以后更改。如果您无视限制,当前的答案是很好的解决方案,因此请将它们留给任何有类似问题的人。至于新任务,以防有人想知道。我要递归打印所有子目录,对它们进行排序,然后将它们与我的程序进行比较,以确保它们具有相似的结果。这是我的解决方案:
#!/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
【问题讨论】:
-
当你使用 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 做什么。 -
我知道是对的。即使对我来说,我的教授对此的描述也毫无意义。这就是我在这里问的原因。不过,我正在考虑反对这篇论文。至少我知道我没疯。
-
该脚本需要单行吗?