【问题标题】:Need help in bash script and awk command在 bash 脚本和 awk 命令中需要帮助
【发布时间】:2012-05-10 08:57:24
【问题描述】:

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

/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 }'`

上面的命令给了我下面的 O/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 

所以我需要在几个地方列出额外的子猫。喜欢

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 中的任何内容将仅打印为名称。所以需要这样的东西。

 ``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 }'"``.

谢谢, 维杰克

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:
    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
    }'
    

    【讨论】:

    • 需要更多帮助,如果我想显示 $NF 的大小,我该怎么办?
    • @vijai:以字符为单位打印长度:print length($NF)
    • 它显示字符数。ex.rabbit.jpg 包含 10 个字符,所以它显示 10。我需要打印该文件的大小。比如 10kb。
    • @vijai:在 AWK 中? system("stat -c %s " $NF) 如果您的系统有统计信息。另一种方式:system("wc -c &lt;" $NF)
    【解决方案2】:

    你可以试试这个 - 塞满了 bashisms,在其他 shell 中不起作用:

    (查找命令在这里) | 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2015-04-12
      • 2017-02-09
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多