Добавьте только файлы из текущего каталога в файл .7z без повторного использования каталогов

#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 заключается в том, чтобы запускать столько процессов, сколько необходимо для обработки всех входных строк. Вы можете дополнительно ограничить количество аргументов для каждого процесса, но по умолчанию он должен использовать максимально поддерживаемый.