我需要一些帮助......
在我的.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所以我不是太担心!
先谢谢你们!!!!
欧文。
答案 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;字符,然后它不是层次结构中最深的目录。