19

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

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

5 ответов5

9

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, если только вы не знаете, что встретите имя файла со встроенным в него символом новой строки, я никогда не пробовал.

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
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 -

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