Как разделить файл tar.gz на несколько файлов с помощью одной команды exec?

Чтобы сделать его немного безопаснее, но полагаясь на расширения GNU:

#! /bin/sh -
pattern=${1?pattern required}; shift
: "${1?no filename specified}"
grep -l --null -e "$pattern" -- "$@" |
  xargs -r0 ls -lrtd --

С помощью --null/ -0мы избегаем проблем с именами файлов, которые содержат пробелы, кавычки или обратную косую черту.

Используя -e "$pattern", мы избегаем проблем с шаблонами, начинающимися с -.

Используя --, мы избегаем проблем с именами файлов, начинающимися с -.

С помощью -dмы избегаем возможных недоразумений, если файлы типа каталог совпадают.

С помощью -rмы избегаем перечисления текущего каталога, если нет соответствующего файла.

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

Также обратите внимание, что -будет означать stdin для grep, но файл с именем -в текущем каталоге для ls. GNU grep -lвыведет(standard input)(или его перевод на ваш язык ). Если вы хотите указать файл с именем -в текущем каталоге, используйте ./-вместо -.

-1
23.07.2020, 18:00
2 ответа

Сначала создайте tar-файл:

tar -caf '/backups/_structure.tar.gz' --ignore-failed-read -C /source.Затем splittar-файл размером 100 МБ

split -b 100M /backups/_structure.tar.gz

Это создаст файл со странными именами, такими как xaa, xab...

Чтобы снова получить исходный файл, просто catвсе эти файлы:

cat xaa xab xac... > _structure.tar.gz

0
18.03.2021, 23:17
tar -cf - --ignore-failed-read -C /source. | gzip |
  split -b 100M - /backups/_structure.tar.gz.

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

-f -указывает tarотправить архив на стандартный вывод, который здесь подключен через канал к gzip, который сжимает его на лету и отправляет на split.

-указывает splitпринимать ввод со стандартного ввода. Второй аргумент — это префикс для чанков. См. справочную страницу split, чтобы узнать, как изменить схему именования для этих фрагментов, если вам не нравится стандартная.

То же самое, чтобы извлечь этот архив, не нужно сохранять полный tar.gzфайл, просто используйте:

cat _structure.tar.gz.* | gunzip | (cd /dest && tar xf -)
1
18.03.2021, 23:17

Теги

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