#linux #bash #7zip
#linux #bash #7zip
Вопрос:
Я хочу добавить / обновить только файлы текущего каталога в archive.7z без повторного использования в более низкие каталоги. Это работает, но медленно из-за инициализации для каждого файла:
find -maxdepth 1 -type f | while read f;do 7za a ~/archive.7z "$f" ; done
Это также работает и намного быстрее, но не уверен, насколько оно защищено от проблемных имен файлов с пробелами и других проблемных символов:
find -maxdepth 1 -type f -print0 | xargs -r0 7za a ~/archive.7z --
Разве не должен быть более элегантный способ? Как -T -
в tar
команде. В настоящее время я использую 7za версии 9.20 на Ubuntu16. Не удалось выполнить такие варианты, как приведенные ниже, они начали повторяться в более низкие каталоги, которые мне не нужны:
7za a -r- ~/archive.7z .
7za a -r- ~/archive.7z ./
7za a -r- ~/archive.7z *
7za a -r- ~/archive.7z -- *.*
7za a -r- ~/archive.7z -- "*"
7za a -r0 ~/archive.7z -- *.*
Ответ №1:
find . -maxdepth 1 -type f -exec 7z a archive.7z {}
Таким образом, вы вызываете один 7z
процесс (вопреки синтаксису -exec {} ;
), и ожидается, что это будет быстро. Фактически он будет использовать максимально допустимые аргументы перед запуском второго процесса.
Кроме того, что касается вашего запроса об именах файлов. Цикл while недопустим. find -print0 | xargs -0
это хорошо и быстро. В общем, вам нужно отделить выходные данные от нуля find
и прочитать их как разделенные нулем входные данные при следующей обработке, чтобы сохранить имена файлов.
Комментарии:
1. Решение xargs, приведенное выше, должно запускать 7z столько же раз, сколько и решение, использующее только find . Решение с чистым поиском выглядит более чистым, но конвейерная версия может быть быстрее, поскольку find может продолжать итерацию файловой системы, пока xargs запустил первый процесс.
2. Спасибо за комментарий @B.Morris, я обновил ответ. xargs тоже будет быстрым. Единственное предостережение заключается в том, что в случае слишком большого количества файлов список аргументов может быть слишком длинным, что (может быть более необходимым для этой работы), а часть поиска обычно в целом крошечная по сравнению с частью архивирования.
3.
xargs
при необходимости также будет запущено несколько процессов.4. @B.Morris Вы имеете в виду, что, например, здесь , если мы получим «список аргументов слишком длинный» для xargs, мы также получим его только для поиска? И оба
exec
иxargs -0
избегают этого в любом случае?5. Основываясь на принятом ответе на этот пост, я думаю, что это могла быть ошибка использования xargs. Общее поведение xargs заключается в том, чтобы запускать столько процессов, сколько необходимо для обработки всех входных строк. Вы можете дополнительно ограничить количество аргументов для каждого процесса, но по умолчанию он должен использовать максимально поддерживаемый.