Получить общий размер нескольких файлов из переменной, содержащей список файлов

Я хочу узнать общий размер некоторых файлов, имена файлов которых могут содержать пробелы:

cd /tmp touch "a0 1" touch "a1 1" 

Я помещаю эти имена файлов в переменные и составляю список:

 var0="/tmp/a0 1" var1="/tmp/a1 1" var2=`echo -e "$var0\n$var1"` 

Теперь, если я проверю себя и распечатаю этот список, все будет хорошо:

 echo "$var2" #returns: #/tmp/a0 1 #/tmp/a1 1 

Но если я попытаюсь получить общий размер, он как-то неправильно понимает символ «\ n»

 du "$var2" #returns: #du: cannot access '/tmp/a0 1\n/tmp/a1 1': No such file or directory 

Как создать процесс «\ n» в качестве разделителя строк? Или, может быть, мне нужно создать список по-другому?

  • Как узнать список каталогов в файловой системе?
  • Расширение раздела в Ubuntu
  • Unix-эквивалент `du -sb` для получения суммарного размера в байтах
  • du на CentOS / RHEL 7 исключает размер блоков каталогов
  • Почему разница между stat и df
  • Установка Siemens NX 10: не удалось определить файловую систему, содержащую / usr / ugs100
  • Выходной файл, созданный tar
  • Как изменить порядок рекурсии
  • 2 Solutions collect form web for “Получить общий размер нескольких файлов из переменной, содержащей список файлов”

    Я бы предложил использовать массив

     var2=( "$var0" "$var1" ) du "${var2[@]}" 

    См. BashGuide / Массивы

    Решение, которое я нашел, состояло в том, чтобы разделить var2 по очереди в цикле while:

     #!/bin/bash var0="/tmp/a0 1" var1="/tmp/a1 1" var2="$(echo -e "$var0\n$var1")" totalsize=0; #this will make script return 0 if var2 somehow contains empty lines only while read "opened_file" #for each file in list do do if [ ! -z "$opened_file" ]; then #if variable is not empty tmp1="$(du -b "$opened_file" | cut -d" " -f1)" #get size of current file and strip unnecessary fields totalsize=$(($totalsize + $tmp1)) fi done <<< "$(echo -e "$var2")" echo "$totalsize" 
    Linux и Unix - лучшая ОС в мире.