Разбор вывода команды оболочки в две переменные построчно

Я пишу сценарий, который выводит гистограмму размеров файлов / каталогов в каталоге. В настоящее время я получаю необходимые данные со строкой

array=($(du -sc * | sort -hr))

что приводит к каждой другой линии array размер и каждая другая строка имя файла, соответствующее ему. Однако, если любое из имен файлов содержит пробелы, этот наивный подход не работает, потому что выходные данные разделяются на каждый пробел.

В основном, что я хочу сделать, это анализировать строку вывода построчно, чтобы из каждой строки я сначала получал символы до первого пробела (размер), а затем до остальной части строки (имя файла, которое может содержать или не содержать пространства). Я думал о чередовании IFS между пробелом и новой строкой, но не мог придумать, как именно я это сделаю.

Я бы предпочел, чтобы решение было переносимым между различными оболочками или, по крайней мере, для работы в ksh.

1 ответ

Решение

Способ читать построчно while read цикл, и read позволяет читать несколько полей:

names=() sizes=()

while read -r size name
do
    echo "The file '$name' has size $size"
    names+=("$name")
    sizes+=("$size")
done < <(du -sc ./* | sort -hr)

./* предотвращает проблемы с файлами, начинающимися с тире (для du) и ведущие пробелы (для read).

Другие вопросы по тегам