2012-05-10 107 views
0

我需要一个bash脚本来递归地打印文件夹名和文件名(在stdo/p中)。 例如: 我有一个像/earth/plants/flowers/rose/rose.jpg的文件夹结构。在bash脚本和awk命令中需要帮助

/earth/plant/fruits/apple/apple.jpg. 
/earth/animals/carni/lions.jpg 
/earth/animals/herbi/omni/dog.jpg 

现在我需要列出该文件和文件夹像这样我的意思是我的O/P脚本应该是,

planet=earth 
category=animal (plant) 
sub cat = carni 
name = lion.jpg. 

我试图

`find/-name "*" -print | awk -F"/" '{ print "\n planet=",$2,"\n category=",$3,"\n sub cat=",$4,"\n Name=",$5, $6 }'` 

上面的命令给了我下面的Ø/P。

planet=earth 
category=animal (plant) 
sub cat = carni 
name = lion.jpg 

但在某些情况下,我在这种情况下,为了已经像“/earth/animals/herbi/omni/rabbit.jpg”附加文件夹被改变输出,如:

planet=earth 
category=animal 
sub cat = herbi 
name = omni 
rabbit.jpg 

所以我需要列出附加SUBCAT在几个地方。像

planet=earth 
category=animals 
sub cat = herbi 
add cat = omni 
name = rabbit.jpg 

所以如何做到这一点与单个脚本。除了awk的脚本也欢迎。

`find/-name "*" -print | awk -F"/" '{ print "\n planet=",$2,"\n category=",$3,"\n sub cat=",$4,"\n Name=",$5,$6}`` 

在这种情况下,有什么在$ 5它将只打印名称only.so需要这样的东西。

``find/-name "*" -print | awk -F"/" '{ print "\n planet=",$2,"\n category=",$3,"\n sub cat=",$4,"\n add cat =",$5,(if $5 = foldername print "add cat = omni") name = $6 }'"``. 

感谢, vijaiķ

回答

5
awk -F"/" '{ 
    print "\n planet=", $2, "\n category=", $3, "\n sub cat=", $4 
    for (i = 5; i < NF; i++) print " add cat=", $i 
    print " Name=",$NF 
}' 
+0

嗨,谢谢你的帮助。 – vijai

+0

需要一个更多的帮助,如果我想显示$ NF的大小,我该怎么办? – vijai

+0

@vijai:打印字符长度:'打印长度($ NF)' –

0

你可以试试这个 - 充满了bash化的,不会在其他壳工作:

(find命令放在这里)| while IFS=/ read root planet category rest; do

echo "planet=$planet" 
    echo "category=$category" 
    size="$(stat -c %s "/$planet/$category/$rest")" 
    while [[ "$rest" == */* ]]; do 
     subcat="${rest%%/*}" 
     rest="${rest#*/}" 
     echo "subcategory=$subcat" 
    done 
    echo "name=$rest" 
    echo "size=$size" 
    echo 
done 

另外,在查找命令上的-name "*"是多余的。但你至少需要-type f