5

Обычно я бы сделал что-то вроде:

tar -czf archive.tar.gz *.csv

Но когда в каталоге слишком много файлов, чтобы оболочка могла развернуться в одну строку, это не работает.

В этих случаях я обычно прибегаю к использованию find . Что-то вроде:

find /path -name '*.csv' -exec tar -rf "./archive.tar.gz" {} +;`

Но, похоже, это работает, только если я не включаю опцию -z потому что вы не можете добавить к сжатым архивам, и использование -c вместо -r перезапишет первый архив, так как find запускает tar несколько раз.

Единственное другое решение, которое я мог бы придумать, - это создать файл .tar с помощью find (как указано выше), а затем использовать вторую команду для его сжатия. Есть ли лучший способ обработки таких случаев?

Я использую Ubuntu Linux.

2 ответа2

9

Нет, вы не можете добавить к сжатому файлу tar, не разархивировав его.

Однако tar может принять свой список файлов для обработки из файла, поэтому вы можете просто сделать:

ls *.csv > temp.txt
tar -zcf ball.tgz -T temp.txt

@slhck указывает, что вышеприведенное решение не будет работать, если в ваших именах файлов есть пробелы (и, возможно, другие раздражающие символы). Эта версия заключает каждое имя файла в двойные кавычки:

ls *.csv | sed -e 's/^\(.*\)$/"\1"/' > temp.txt
tar -zcf ball.tgz -T temp.txt

(Это, конечно, сломается, если у вас есть двойные кавычки в ваших именах файлов, и в этом случае вы получите то, что вы заслуживаете. :)

7

В качестве надежного решения используйте find для разделения имен файлов по нулевому символу, а затем направьте напрямую в tar , который читает входные данные, разделенные нулем:

find . -name '*.csv' -maxdepth 1 -print0 |
tar -czf archive.tgz --null -T -

Теперь это будет правильно обрабатывать все имена файлов и не ограничиваться количеством файлов.

Использование ls для генерации списка имен файлов для анализа другой программой является распространенным антипаттерном , которого следует по возможности избегать. find может генерировать вывод с нулевым разделителем (-print0), который большинство утилит может читать или анализировать дальше. Поскольку нулевой символ является единственным символом, который не может появиться в имени файла (и / , очевидно), вы всегда будете в безопасности с этим.

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