【问题标题】:Cut Filename and size from output (ls -l)从输出中剪切文件名和大小 (ls -l)
【发布时间】:2015-06-07 15:43:01
【问题描述】:

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

  1. 鲁塔:/等
    • 市长 fichero:databig.dat(924873294 字节)
    • Menor fichero:密码(43213 字节)
  2. ruta: /home/asignaturas
    • fichero 市长:所以(4096 字节)
    • Menor fichero:所以(4096 字节)
  3. 鲁塔:/lib
    • 市长 fichero:libx86.so.1(5512945 字节)
    • Menor fichero:网络(4096 字节)

在这个脚本中,我需要从我给脚本的路径中显示最大文件的名称和大小,最小的文件相同,如下所示: "./lsMinMax /etc /home /lib"

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

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

这是我的输出:

output

我希望你能帮助我。对不起我的英语。

【问题讨论】:

    标签: unix awk command cut ls


    【解决方案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
    

    【讨论】:

    • 这是一个更好的答案。
    【解决方案2】:

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

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

    改为在循环内使用$i 来获取文件名。

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      相关资源
      最近更新 更多