2015-04-02 3 views
0

я делаю сценарий, чтобы сделать следующее:Cut файла и размер от вывода (LS -l)

  1. рута:/и т.д.
    • Мэр fichero: databig.dat (924873294 байт)
    • MENOR fichero: ПАРОЛЬ (43213 байт)
  2. рута:/главная/asignaturas
    • Мэр fichero: так (4096 байт)
    • Менор fichero: так (4096 байт)
  3. рута:/Библиотека
    • Мэр fichero: libx86.so.1 (5512945 байт)
    • Менор fichero: сети (4096 байт)

в этом сценарии, мне нужно, чтобы показать имя и размер от самого большого файла, то же от самых маленьких, от пути, который я даю сценарий, например: "./lsMinMax/etc/home/lib"

Проблема возникает, когда я пытаюсь разрезать только имя и размер. Я получил что-то вроде этого: drwxr-s --- 2 корень dip 4096 feb 2 15:13 chatsripts. Я пытаюсь разрезать его, используя пробелы, как ограничители, но в случае/etc я получил имя, а в/home я получил дату.

Это то, что я есть в данный момент (в настоящее время я не использую вырезать, им пытаются с помощью AWK): script

И это мой выход:

output

Я надеюсь, что вы можете помочь меня. Извините за мой английский.

ответ

0

Как рекомендуется от Bash Pitfalls, не пытайтесь разобрать выход ls.

Использование ls просто не нужно. Это внешняя команда , выход которого предназначен специально для чтения человеком, не разобран сценарий

Вместо этого используйте $i внутри цикла, чтобы получить имя файла.

1

Как Шейн намекнул, 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 
+0

Это гораздо лучше ответ. –

Смежные вопросы