一段时间以前,我编写了一个JavaScript程序来遍历目录树,并从树的前三个级别中构建HTML导航菜单文件。现在我正在尝试使用Bash来复制这个程序,因为JS程序需要IE浏览器和ActiveX才能运行。我对Bash相当陌生,所以这对我来说是一个很好的学习经验。
所以,我有一个如下结构的目录:
-Folder A
--Folder B
--Folder C
--Folder C1
--Folder C2
--Folder CC1
--Folder D
--Folder D1
--Folder E
等等,我明白了。无论如何,文件夹名称有所不同,但每个文件夹中都有一个名为“foldername.txt”的文本文件。在这个文件中,有一行文本,显示出菜单中要使用的实际文件夹名称(这是由于某些名称的长度)。
因此,我正在尝试循环遍历每个文件夹/子文件夹,仅到第3级,读取文件夹中的每个foldername.txt文件并返回名称,同时保持文件夹层次结构。我希望这样讲清楚了。输出附加了HTML标签,并回显到.htm文件中。
到目前为止,我已经尝试了不同的方法。下面的代码几乎做到了我想要的事情,它将按照文本文件返回名称扫描目录,但未保持层次结构。不幸的是,我没有包括-maxdepth的find版本。正如你所看到的,我尝试了嵌套循环,因为它只有三层深度,但递归会继续每个级别,以便我得到重复和奇怪的结果。
#!/bin/bash
ROOT=/data/
OUTPUTFILE=${ROOT}/Menu-test.html
# Create first level items - these are static
HEADING="<UL class=navlist1>
<LI><SPAN class=plus><p>-</p></SPAN><A class=''>Level 1 products</A></LI>"
END="</UL>"
L2="<UL class=navlist2>"
L3="<UL class=navlist3>"
LI="<LI><SPAN class=plus><P>+</P></SPAN>"
LIEND="</LI>"
echo $HEADING > $OUTPUTFILE;
# set shell options
shopt -s nullglob
# loop through top level dir
for d in $DIR/*/
do
for file in $(find $d -name "foldername.txt");
do
OUT=$(awk '{ print $0 }' $file)
echo $LI$OUT$LIEND >> $OUTPUTFILE;
done
# loop through second level dir
for e in $d/*/
do
echo $L2 >> $OUTPUTFILE;
for file2 in $(find $e -type f -name "foldername.txt");
do
OUT2=$(awk '{ print $0 }' $file2)
echo $LI$OUT2$LIEND >> $OUTPUTFILE;
done
echo $END >> $OUTPUTFILE;
# loop through third level dir
for f in $e/*/
do
echo $L3 >> $OUTPUTFILE;
for file3 in $(find $f -type f -name "foldername.txt");
do
OUT3=$(awk '{ print $0 }' $file3)
echo $LI$OUT3$LIEND >> $OUTPUTFILE;
done
echo $END >> $OUTPUTFILE;
done
done
done
echo $END >> $OUTPUTFILE;
抱歉,这篇文章很长,代码也有点乱,但我真的想自己试着写一下,因为这是我学习的最佳方式。所以你们有什么关于如何让这个工作的想法吗?请注意,我没有使用Python或任何其他语言,所以只能使用bash。
我需要的输出结果应该像下面这样(连字符只是为了保持格式,不在输出中):
**<LI><SPAN class=plus><P>+</P></SPAN><A href=''>**
<UL class='navlist1'>
<LI><SPAN class='plus'><p>-</p></SPAN><A class=''>Folder A</A>
<UL class='navlist2' style='display:block'>
<LI><SPAN class='bull'><p class='bull'>•</p></SPAN><A href='http://www.somewhere.com/index.htm'>Folder A1</A></LI>
<LI><SPAN class='bull'><p class='bull'>•</p></SPAN><A href='http://www.somewhere.com/index.htm'>Folder A2</A></LI>
<LI><SPAN class='bull'><p class='bull'>•</p></SPAN><A href='http://www.somewhere.com/index.htm'>Folder A3</A></LI>
</UL**></A>
<UL class=navlist1>**
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder B</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder C</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D</A></LI>
<UL class=navlist2>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D1</A>
<UL class=navlist3>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D1A</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D1B</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D1C</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D1D</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D1E</A></LI>
</UL>
</LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D2</A>
<UL class=navlist3>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D2A</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D2B</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder D2C</A></LI>
</UL>
</LI>
</UL>
</LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder E</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder F</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder G</A></LI>
<UL class=navlist2>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder G1</A>
<UL class=navlist3>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder G1A</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder G1B</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder G1C</A></LI>
<LI><SPAN class=plus><P>+</P></SPAN><A href=''>Folder G1D</A></LI>
</UL>
</LI>
</UL>
</LI>
</UL>
**</LI>**
所以,这是目前的工作输出。我还需要在每个标签中包含href链接,但是每个子文件夹的级别将具有不同的路径,如下所示:
navlist1 = http://www.somewhere.com/here//landing.htm
navlist2&3 = http://www.somewhere.com/here/there//index.htm
“folder”是目录的实际文件夹名称,而不是文本文件中的名称,否则链接将无法使用。
上述加粗的行不应出现在输出中。
谢谢。
for VAR in $DIR/*/*/*
,它返回最多三级深度的所有文件+路径。这将大大减少您的代码量。 - thom