Требуется решение для архивации папки, исключающей все файлы.log и.err с использованием подстановочных знаков

Я представляю второй ответ на этот вопрос (это интересная проблема). Это полностью отличается от моего решения SQLite и от довольно многообещающих решений sort + join , которые начинают появляться:

Использование вашего первоначального подхода с grep -f , но буквально немного решает проблему. Давайте разделим «файл запроса», file2 на управляемые фрагменты, используя разбиение .

Утилита split может разбить файл на несколько файлов меньшего размера на основе количества строк.

Файл 3,2 Гб со средней длиной строки из 20 символов содержит около 172 000 000 строк (если я не допустил арифметической ошибки). Возможно разделение на 2000 файлов по 85000 строк в файле.

Итак,

$ mkdir testing
$ cd testing
$ split -l 85000 -a 4 ../file2

Параметр -a 4 указывает split использовать четыре символа после начального x для создания имен файлов для новых файлов. Файлы будут называться xaaaa , xaaab и т. Д.

Затем запустите исходный grep -f на них:

for f in x????; do
  grep -F -f "$f" ../file1
done

Это может make grep может хранить в памяти гораздо меньший набор шаблонов запросов.

ОБНОВЛЕНИЕ : с 145 526 885 строками используйте split -l 72000 -a 4 для создания примерно 2000 файлов.

Не забывайте очищать каталог testing каждый раз, когда вы пытаетесь создать новый набор разделенных файлов.

Обратите внимание, что разделенные файлы из этого ответа по отдельности можно использовать в качестве входных данных для любого другого ответа, который вы можете получить на этот вопрос.

-2
20.07.2020, 10:09
1 ответ

Для этого можно использовать комбинацию find, cpio и gzip. Cpio в режиме копирования -out берет список файлов из стандартного ввода и создает архив на стандартном выводе. Архив можно передать в gzip для сжатия.

Следующий пример находит все файлы, кроме файлов с расширениями.err и.log, и передает список файлов в cpio, который, в свою очередь, передает архив в gzip. Наконец, сжатый архив перенаправляется в файл.

find app/jboss -not -name "*.err" -not -name "*.log" | cpio -o | gzip > /tmp/backup.gz

Чтобы извлечь файлы из архива, распакуйте файл gzip в стандартный вывод, передав его в cpio в режиме ввода:

zcat /tmp/backup.gz | cpio -i

Cpio поддерживает различные форматы архивов, и если вы хотите, чтобы выходные данные были совместимы на всех ваших платформах, вы можете изучить различные параметры формата.

Версия программы tar для GNU имеет аналогичную опцию -T(--files-from=FILE). Вы можете использовать тире(-)в качестве имени файла, чтобы прочитать имена файлов из стандартного ввода.

4
18.03.2021, 23:18

Теги

Похожие вопросы