Як створити файл tar за алфавітом?


22

Я хочу створити файл tar, де всі каталоги та файли обробляються в алфавітному порядку. Це для всієї ієрархії каталогів, на яку розміщено орієнтацію, тому вона розпочнеться з обробки першої каталоги в алфавітному порядку, а потім підкаталогів там в алфавітному порядку і т. Д. Я переглянув сторінку man і не можу знайти комутатор для цього.

Я визнаю, це наполовину новизна, половина незначна оптимізація. Я просто не можу повірити, що це непростий спосіб зробити це. Мені, мабуть, чогось не вистачає.


2
Чому ти хочеш це робити?
matthias krull

Здебільшого, це тому, що я хочу знати, наскільки близька до завершення операція дьогтю. Коли файли завантажуються у випадковому порядку, немає можливості сказати прапорцем -v.
Ерік Робертсон

2
Це не зовсім вірно; Якщо ви передаєте вихід у файл і знаєте кількість файлів (скажімо, команду швидкого пошуку), ви можете порівняти вихід -v (wc -l) з кількістю знайдених файлів, щоб отримати відчуття прогресу ...
Slartibartfast

2
@matthiaskrull У мене є незв'язана причина цього, я створюю файл OVA (який є файлом tar) для розгортання VM на сервері VMWare ESX. OVA потребує файлів у визначеному порядку всередині нього (перший файл повинен бути OVF тощо).
xask

1
Для цього є також дуже вагома причина: продуктивність у дуже великому файлі, коли потрібно витягти лише його частину. Оскільки його порядок за замовчуванням є випадковим, і ви хочете витягнути файл / каталог, якщо він замовлений, він буде швидшим, якщо його немає, йому потрібно буде сканувати весь архів до того, як він знатиме, що він закінчився.
StormByte

Відповіді:


12

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

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

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


Відмінна пропозиція щодо використання --но-рекурсійного варіанту, дякую.
Ерік

Це рішення, яке працювало на мене. У мене інший випадок використання, ніж Ерік і 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
Doug Harris

У мене занадто багато файлів (20 000+), щоб вказати їх у командному рядку.
Ерік Робертсон

4
Порядок файлів у файлі tar має значення, якщо вам потрібно розпакувати та відобразити під час завантаження.
Ерік

Залежить від файлової системи.
Thorbjørn Ravn Andersen

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.