BASH – 只打印path中最深的目录

我需要一些帮助…..

在我的.bashrc文件中,我有一个非常有用的函数(它可能有点粗糙,准备好了,有点古怪,但它工作得很好!)读取input文件,并在每个文件上使用“”input行来创build一个目录树。 这棵树然后被打印到一个输出文件(和文件夹的大小一起)。

multitree() { while read cheese do pushd . > /dev/null pushd $cheese > /dev/null echo -e "$cheese \n\n" >> ~/Desktop/$2.txt tree -idf . >> ~/Desktop/$2.txt echo -e "\n\n\n" >> ~/Desktop/$2.txt du -sh --si >> ~/Desktop/$2.txt echo -e "\n\n\n\n\n\n\n" >> ~/Desktop/$2.txt popd > /dev/null done < $1 cat ~/done } 

这是一个节省时间没有结束,并输出一个片段,如下所示:

 ./foo ./foo/bar ./foo/bar/1 ./foo/bar/1/2 

等等…

然而,我需要做的第一件(也是最麻烦的)事情是删除所有只留下最深的文件夹path的条目(使用上面的例子,它将被简化为./foo/bar/1/2)

有没有一种方法来处理文件之前/之后的树function只打印最深层次?

我知道像Python的东西可能会做得更好,但我的问题是我从来没有使用Python而且我不知道工作系统会让我运行Python …他们让我们修改我们自己的.bashrc所以我不要太担心!

在此先感谢家伙!

欧文。

Solutions Collecting From Web of "BASH – 只打印path中最深的目录"

你可以使用

 find . -type d -links 2 

替换. 如果需要,可以使用目录。

编辑:说明:

在目录中find与给定过滤器匹配的文件。 在这种情况下,目录是. ,过滤器是-type d -links 2

-type d过滤器的目录

为那些有两个(硬)链接到他们的名字链接-links 2过滤器。 实际上,对于没有子目录的所有目录,这个过滤器是有效的,因为只有那些有两个:在父目录和目录中. 链接在自己。 那些有子目录的子目录中也有..链接。

这里有个提示:

您只需要计算每行中“/”字符的数量。

如果当前行少于前一行中的“/”字符数,则前一行将是其层次结构部分中的“最深”目录。

这一行,以及任何后续行中更少的“/”字符不会是整个目录层次结构中最深的目录。 只要你得到一个相同数量的“/”字符或更大的行,那么你可以“重置”,并再次留意少数“/”字符的第一行。

最后,你需要处理一个简单的例子:树中只有一行输出,当前目录没有子目录,所以默认是赢的。

另一种可以实现这一点的方法是考虑以下声明:

如果一个目录的名称也作为列表中另一个目录的确切前缀存在,后跟“/”字符,那么它不是层次结构中最深的目录。