从输出中剪切文件名和大小(ls -l)

时间:2015-04-02 15:47:36

标签: unix awk command cut ls

我正在做一个脚本来执行以下操作:

  1. ruta:/等
    • Mayor fichero:databig.dat(924873294 bytes)
    • Menor fichero:passwd(43213 bytes)
  2. ruta:/ home / asignaturas
    • Mayor fichero:so(4096 bytes)
    • Menor fichero:so(4096 bytes)
  3. ruta:/ lib
    • Mayor fichero:libx86.so.1(5512945 bytes)
    • Menor fichero:网络(4096字节)
  4. 在这个脚本中,我需要显示最大文件的名称和大小,从最小的文件中显示,从我给脚本的路径,如下所示:  “ ./ lsMinMax / etc / home / lib

    当我尝试仅剪切名称和大小时,我的问题开始了。我有这样的事情: drwxr-s --- 2 root dip 4096 feb 2 15:13 chatsripts 。我尝试使用空格作为限制器来剪切它但是在/ etc的情况下我得到了名字,在/ home我得到了日期。

    这就是我现在所拥有的(现在我不使用剪切,我尝试使用awk): script

    这是我的输出:

    output

    我希望你能帮助我。抱歉我的英文。

2 个答案:

答案 0 :(得分:1)

正如Shane暗示的那样,don't parse ls。使用stat查询文件和大小。然后我使用awk来解析stat输出并确定最大和最小:

#!/bin/sh

lsMinMax () (
    cd "$1"
    echo "ruta: $1"
    stat -c "%s/%n" * | awk -F/ '
        NR == 1  { min = max = $1; minf = maxf = $2 }
        $1 < min { min = $1; minf = $2 }
        $1 > max { max = $1; minf = $2 }
        END {
            printf "   Mayor fichero: %s (%d bytes)\n", maxf, max
            printf "   Menor fichero: %s (%d bytes)\n", minf, min
        }
    '
)

for dir do
    lsMinMax "$dir"
done

答案 1 :(得分:0)

根据Bash Pitfalls的建议,请勿尝试解析ls的输出。

  

使用ls显然是不必要的。这是一个外部命令   其输出专门用于人类阅读,而不是   由脚本解析

而是在循环中使用$i来获取文件名。