Вы можете использовать опцию -u/--update
в сочетании с xargs
. Я только что попробовал и, чтобы доказать, что это работает, я дал аргументы имени файла tar
один -на -один, используяxargs -n 1
:
find top_of_tree/ -type f | xargs -n 1 tar -uf archive.tar
Конечно, это всего лишь доказательство концепции. В вашем случае, вероятно, более практично разрешить xargs
разделять список аргументов на более крупные части, которые не превышают ограничение длины аргумента, чтобы избежать большого количества вызововtar
:
find top_of_tree/ -type f | xargs tar -uf archive.tar
Условием является то, что все реализации tar
на ваших платформах поддерживают хотя бы один из флагов -u/--update
.
РЕДАКТИРОВАТЬ :флаги -u/--update
позволяют tar
создавать и добавлять в архив.
Только что заметил, что, к сожалению, нельзя обновлять сжатые архивы (tgz, созданные с флагом -c
). Однако вы можете во что бы то ни стало сначала создать несжатый -архив, а затем сжать результаты.
Кроме того, вас не должно смущать, что я использую флаги для tar
с дефисом ('-' символ ). Он принимает обе формы. В моем примере -uf
будет эквивалентно uf
в вашем.
Что касается опции -
,это, вероятно, не задокументировано на справочной странице tar
, потому что это очень распространенное соглашение Unix для инструментов командной строки, которые работают как с потоками, так и с именованными файлами. -
обычно является специальным аргументом для фильтров и называет стандартный входной поток файлом.
Использование подстановки процесса с флагом -f
(также--force
)работало:
${PAGER:-less} -f <(echo "$contents")