Как мне создать файл tar в алфавитном порядке?


22

Я хочу создать tar-файл, в котором все каталоги и файлы будут обрабатываться в алфавитном порядке. Это относится ко всей иерархии каталогов, которая настраивается, поэтому она будет начинаться с обработки первого каталога в алфавитном порядке, а затем в подкаталогах в алфавитном порядке и т. Д. Я просмотрел справочную страницу и не могу найти переключатель для этого.

Признаюсь, это наполовину новинка, наполовину небольшая оптимизация. Я просто не могу поверить, что не существует простого способа сделать это. Я должен что-то упустить.


2
почему ты хочешь сделать это?
Матиас Крулл

В основном это потому, что я хочу знать, насколько близка операция tar к завершению. Когда файлы загружаются в случайном порядке, это невозможно определить с помощью флага -v.
Эрик Робертсон

2
Это не совсем верно; Если вы перенаправили вывод в файл и знаете количество файлов (скажем, команду быстрого поиска), вы можете сравнить вывод -v (wc -l) с количеством файлов из find, чтобы получить представление о прогрессе ...
Слартибартфаст

2
@matthiaskrull У меня есть несвязанная причина для этого, я создаю файл OVA (который является файлом tar) для развертывания виртуальных машин на VMWare ESX Server. OVA нужны файлы в определенном порядке внутри (первый файл должен быть OVF и т. Д.).
xask

1
Для этого также есть очень веская причина: производительность очень большого файла, когда вы хотите извлечь только его часть. Так как его порядок по умолчанию случайный, и вы хотите извлечь файл / каталог, если он упорядочен, он будет быстрее, если нет, ему нужно будет просмотреть весь архив, прежде чем он узнает, что он закончил.
StormByte

Ответы:


12

Slartibartfast находится на правильном пути, но поведение tar по умолчанию сводится к каталогам, поэтому вы можете получить более одной копии одного и того же файла, включенного в созданный файл tar. Вы можете проверить, выполнив tar tf file.tar | sort Обходной путь - включить опцию --no-recursion в tar. Кроме того, вы должны иметь возможность отправлять странные имена файлов, используя -print0 опцию для поиска, затем используя --nullопцию для tar. Конечный результат выглядит так:

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

Вы можете проверить порядок в файле tar с помощью tar tsf tarfile.tar. Хотя вам, вероятно, никогда не понадобятся опции -print0, -z и --null, если вы не знаете, что встретите имя файла со встроенным в него символом новой строки, я никогда не пробовал.


Отличное предложение для использования опции --no-recursion, спасибо.
Эрик

Это решение, которое сработало для меня. У меня другой вариант использования, чем Эрик и Google привели меня сюда. Я собираю снимки с течением времени полного состояния удаленной системы. Данные сильно избыточны. Сортировка входных данных по времени (имена файлов имеют временную метку) улучшает производительность компрессора. Быстрый тест показывает улучшение в 2 раза (lzma2). Кроме того, я не распаковываю архив в файловую систему, а выполняю потоковую обработку записей tar. Отсортированный поток делает намного более приятный вывод отладочной информации и имеет другие преимущества в цепочке процессов. +1
Йоханнес

5

Порядок файлов в файле tar на самом деле не имеет значения, так как при извлечении файлов файловая система все равно не сохранит порядок.

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

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup

2
или просто отсортировать вывод:tar tf tarfile | sort
Даг Харрис

У меня слишком много файлов (более 20 000), чтобы указать их все в командной строке.
Эрик Робертсон,

4
Порядок файлов в файле tar имеет значение, если вам нужно распаковать и отобразить во время загрузки.
Эрик

Зависит от файловой системы.
Турбьерн Равн Андерсен

4

Предполагая, что у вас нет файлов с символами новой строки в именах:

find /source_directory -print | sort | tar -czf target.tgz -T -

Если это не сработает (никогда не пробовал, поэтому я не знаю - означает stdin для аргумента -T):

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

Тогда возникает вопрос, почему. Но иногда легче не спрашивать.


2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

Pax - своего рода преемник POSIX для cpio и tar, и он объединяет лучшие аспекты обоих. По умолчанию записывает архивы tar (ustar). Он также выполняет автоматическое заполнение и запрос для мультимедиа и печатает резюме, когда это сделано.


0

В качестве альтернативы ответу @ CharlieHerron, если вас интересует только сохранение содержимого (файлы, символическая ссылка) и метаданных папки (например, разрешение папки, mtime и т. Д.), Вы можете отфильтровать папки из findвыходных данных.

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.