Это просто, вы можете использовать:
du -b /tmp/* | awk 'BEGIN{i=0} {i=i+$1} END{print i}'
Если вы не используете подстановочный знак, если вы используете имя каталога, такое как /tmp
, вам нужно избегать последней записи, потому что вывод du -b /tmp
похож на:
size1 file1
size2 file2
size_total.
Так что теперь вам следует избегать этой последней записи, поэтому используйте:
du -b /tmp | awk 'BEGIN{i=0} {if( $2 != "." ){i=i+$1}} END{print i}'
Однако вы также можете использовать опцию -s
, она рассчитает сводку за вас, после чего вам не нужно добавлять значения, просто распечатайте последнее, т.е.:
du -s directory
Можно ли использовать регулярные выражения? Мне все равно пришлось раскошелиться на sed
, чтобы чисто заменить %...%
на (.*)
, хотя:
$ psource=/backup/monthly.1/where/somehost-someshare
$ tsource=/backup/%PERIOD%/where/%HOST%-%SHARE%
$ # replace labels with '(.*)', need sed to avoid greediness of * in ${../../..}
$ tsource_re=$(sed 's/%[^%]*%/(.*)/g' <<<"${tsource}")
$ # match against tsource to get template names
$ [[ $tsource =~ $tsource_re ]]; tmatch=(${BASH_REMATCH[@]:1})
$ # match against psource to get template values
$ [[ $psource =~ $tsource_re ]]; pmatch=(${BASH_REMATCH[@]:1})
$ for i in ${!tmatch[@]}; do printf "%s:\t%s\n" "${tmatch[$i]}" "${pmatch[$i]}"; done
%PERIOD%: monthly.1
%HOST%: somehost
%SHARE%: someshare
это должно помочь:
tsource='/backup/%HOST%/%SHARE%/%PERIOD%'
psource='/backup/somehost/someshare/monthly.1'
IFS=$'\n' read -d '' -ra var_names <<< $(grep -Po "(?<=%)[[:upper:]]+(?=%)" <<< "$tsource")
IFS='/' read -ra var_values <<< $(echo ${psource#/*/})
declare -A vars=( ["${var_names[0]}"]="${var_values[0]}" ["${var_names[1]}"]="${var_values[1]}" ["${var_names[2]}"]="${var_values[2]}" )
echo ${vars[HOST]} ${vars[SHARE]} ${vars[PERIOD]}
>somehost someshare monthly.1