Я использовал эту однострочную команду, которую нашел в другом посте, и она прекрасно работает для одной папки за раз. Это команда:

tar -cf - /opt/folder1 | pv -s $(du -sb /opt/folder1 | awk '{print $1}') | gzip > archive.tar.gz

Как это можно изменить для одновременной работы с несколькими файлами / папками и получения общего прогресса, а не для запуска одной и той же команды для каждой папки / файла. Вот пример использования:

У меня есть файлы /opt /folder1, /opt /folder2 и /opt/folder3/*.db. Все они могут быть объединены как в одну переменную, как это.

filestobackup=(
        /opt/folder1
        /opt/folder2 
        /opt/folder3/*.db
    )

Это не работает:

tar -cf - "${filestobackup[@]}" | pv -s $(du -sb "${filestobackup[@]}" | awk '{print $1}') | gzip > archive.tar.gz

1 ответ1

0

Быстрый ответ: измените строку на

tar -cf - "${filestobackup[@]}" | pv -s $(du -cb "${filestobackup[@]}" | tail -1 | awk '{print $1}') | gzip > archive.tar.gz

Длинный ответ: проблема в том, что du выдаст несколько выходных строк, а не только одну, как в случае одного каталога. Переключатель -s делает du печати общего размера для каждой записи. Так как вы передаете несколько записей du (две для folder1 и folder2, плюс по одной для каждого файла .db в папке 3), du напечатает что-то вроде:

2112345 opt/folder1
57148   opt/folder2
388     opt/folder3/foo.db
161     opt/folder3/bar.db

Используя ключ -c , du печатает одну последнюю строку, содержащую итоговую сумму. Для того , чтобы использовать это значение, вы должны фильтровать du выход получить только последнюю строку.

Это можно сделать либо с помощью awk, который вы уже используете в конвейере, либо, проще, хотя и с (незначительным) снижением производительности, добавив фильтр tail -1 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .