BASH - 仅打印路径中最深的目录

时间:2014-12-24 00:08:20

标签: linux bash tree

我需要一些帮助......

在我的.bashrc文件中,我有一个非常有用的功能(它可能有点粗糙,准备好了,有点hacky,但它有效!)它读取输入文件,并使用'tree'函数每个输入行创建一个目录树。然后将此树打印到输出文件(以及文件夹的大小)。

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

等等......

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

有没有办法在树函数之前/之后处理文件只打印最深层?

我知道像python这样的东西可能做得更好,但我的问题是我从未使用过python我不确定工作系统会让我运行python ......他们让我们修改自己的.bashrc所以我不是太担心!

先谢谢你们!!!!

欧文。

2 个答案:

答案 0 :(得分:18)

您可以使用

find . -type d -links 2

如果需要,将.替换为目录。

编辑:说明:

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

目录

-type d过滤器

-links 2过滤那些有两个(硬)链接的人。实际上,这会过滤掉所有没有子目录的目录,因为只有那些目录有两个:父目录中的那个和自己的.链接。具有子目录的那些子目录中也有..个链接。

答案 1 :(得分:2)

这里有一个提示:

你只需计算&#34; /&#34;的数量。每行中的字符。

如果当前行的数量少于&#34; /&#34;前一行中的字符,前一行将是&#34;最深的&#34;目录在其层次结构中。

此行以及任何后续行仍然更少&#34; /&#34;字符不会是整个目录层次结构中最深的目录。一旦你得到一个具有相同数量的&#34; /&#34;字符,或更大,那么你可以&#34;重置&#34;并且,再一次,留意第一行,并且#34; /&#34;字符。

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

您可以通过考虑以下声明来实现此目的:

如果目录的名称也作为列表中另一个目录的确切前缀存在,则后跟&#34; /&#34;字符,然后它不是层次结构中最深的目录。