Как сохранить вывод и распечатать его снова с разбиением вывода на новые строки

Вы можете использовать косвенное указание параметра $ {! Parameter} , т.е. в вашем случае $ {! A} :

$ foo1=abc
$ i=1
$ a="foo${i}"
$ echo "${!a}"
abc

Из раздела «Расширение параметров» man bash :

$ {параметр}

.......

Если первый символ параметра - восклицательный знак (!), Он вводит уровень косвенного обращения к переменной. Bash использует значение переменной, сформированное из оставшейся части параметра, как имя переменной; затем эта переменная расширяется, и это значение используется в остальной части подстановки, а не в самом значении параметра .

0
19.05.2015, 14:26
3 ответа

Вот один из способов сделать это:

#!/bin/bash
dir=$1

minfile=$( du "$dir" -hab | sort -n -r | tail -1 | awk '{ print $1 }' )
out=$( du "$dir" -hab | sort -n -r | tail -n 2 | awk '{ print $2 }' )

printf "Minimum file size: %s\n" "$minfile"  
printf "$out\n"

Пример вывода приведенного выше кода:

Minimum file size: 94
/home/krt/my-scripts/multissh.sh
/home/krt/my-scripts/vpn.sh
0
29.04.2021, 00:28

Я думаю, что вам нужен сценарий, который найдет i) наименьший размер файла в каталоге и его подкаталогах и ii) перечислит все файлы этого наименьшего размера. Если это так, вы можете сделать:

#!/usr/bin/env bash
du -ab "$@" |
    awk -F"\t" '($1<=s || NR==1){
                  s=$1; 
                  a[s]=a[s]"\n\t"$2; 
                  a[-1]=1
                }
                END{
                 if(a[-1]){
                  printf "Smallest file size:%d%s\n",s,a[s]}
                 }'

Или просто запустить его как однострочное:

du -ab | awk -F"\t" '($1<=s || NR==1){s=$1;a[s]=a[s]"\n\t"$2;a[-1]=1}END{if(a[-1]){printf "Smallest file size:%d%s\n",s,a[s]}}'

Пример вывода:

$ a.sh .
Smallest file size:42
    ./foo/file2
    ./file13
    ./file with spaces

Объяснение

  • du -ab : Нет смысла использовать оба -b и -h , они перекрывают друг друга. Это напечатает размеры всех файлов и каталогов.
  • awk -F "\ t" : запустить awk , установив в качестве разделителя поля ввода табуляцию. Таким образом, имена файлов с пробелами будут обрабатываться правильно.
  • ($ 1 <= s || NR == 1) {...} : если размер этого файла меньше наименьшего размера или если это первый найденный файл.
    • a [s] = a [s] "\ n" $ 2; : ассоциативный массив a имеет размер каждого файла в качестве ключа и список файлов ( разделенные новой строкой) в качестве значения. Если этот файл меньше или меньше самого маленького, добавьте его в массив.
    • s = $ 1; : установить s на новый наименьший размер;
    • a [-1] = 1 : это просто используется для того, чтобы сценарий не печатал вывод если файлы не найдены. Мы устанавливаем его на 1 , если был найден хотя бы один файл.
  • END {} : выполняется после того, как все входные данные были прочитаны. На этом этапе s будет наименьшим найденным размером файла.
    • if (a [-1]) {...} : если был найден хотя бы один файл или каталог;
    • printf «Минимальный размер файла:% d% s \ n», s, a [s] : распечатайте его / их.

Примечания

  • Это может иметь дело с именами файлов, которые содержат пробелы (он прерывается, если они содержат табуляцию или новую строку);
  • Он может работать с несколькими целевыми каталогами;
  • Он не возвращает вывода, если нет файлов / каталогов были найдены;
  • Перечисляет все файлы наименьшего размера, а не только последние N (как вы получите, если вы используете tail ).
0
29.04.2021, 00:28

Вы можете попробовать следующее:

size=$(du -hab "$dir" | sort -n -r | tail -n 2)
printf "File size: %s" "$size"
0
29.04.2021, 00:28

Теги

Похожие вопросы