Вы можете использовать косвенное указание параметра $ {! Parameter}
, т.е. в вашем случае $ {! A}
:
$ foo1=abc
$ i=1
$ a="foo${i}"
$ echo "${!a}"
abc
Из раздела «Расширение параметров» man bash
:
$ {параметр}
.......
Если первый символ параметра - восклицательный знак (!), Он вводит уровень косвенного обращения к переменной. Bash использует значение переменной, сформированное из оставшейся части параметра, как имя переменной; затем эта переменная расширяется, и это значение используется в остальной части подстановки, а не в самом значении параметра .
Вот один из способов сделать это:
#!/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
Я думаю, что вам нужен сценарий, который найдет 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]
: распечатайте его / их. tail
). Вы можете попробовать следующее:
size=$(du -hab "$dir" | sort -n -r | tail -n 2)
printf "File size: %s" "$size"