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

Предположение Вас имеет Ваше другое право материала USB (ehci/uhci, и т.д.):

Драйверы устройств-> поддержка HID-> USB поддержка HID-> USB Транспортный уровень HID

10
18.11.2016, 00:10
3 ответа

Для GNU TAR :

--sort=ORDER
 Specify the directory sorting order when reading directories.
 ORDER may be one of the following:

`none'
      No directory sorting is performed. This is the default.

`name'
      Sort the directory entries on name. The operating system may
      deliver directory entries in a more or less random order, and
      sorting them makes archive creation reproducible.

`inode'
      Sort the directory entries on inode number. Sorting
      directories on inode number may reduce the amount of disk
      seek operations when creating an archive for some file
      systems.

Вы, вероятно, также захотите посмотреть - -Получение по порядку .

17
27.01.2020, 20:00

tar сам по себе не может этого сделать, поэтому его нужно создать из правильно упорядоченного списка. В принципе, вы можете использовать опцию tar -T, но нет способа указать, что имена файлов в этом списке должны быть NUL прерваны. Поэтому, если у вас есть какие-либо имена файлов с новыми строками в них (что разрешено), то это просто прервется.

Лучше использовать cpio для генерации файлов, так как он принимает NUL-файлы, завершенные списком, и может генерировать tar-файлы.

Если бы ваша команда tar была:

tar cvf /somedir/all.tar .

Тогда для сортировки по имени вам пришлось бы сделать (предполагая, что GNU find и cpio):

find . -type f -print0 | sort -z | \
  cpio --create --null --format=ustar -O /somedir/all.tar

Недостатком является то, что подкаталоги располагаются между именами файлов. Вы можете делать трюки с finds -printf0, указывая каталог и глубину информации и сортируя с sort -n, но это также влияет на то, как файлы с числами сортируются внутри каталога.

Если вышеизложенное неудовлетворительно, вы, вероятно, могли бы использовать небольшую питоновскую программу, основанную на os.walk(), чтобы сгенерировать нужный вам порядок с полным контролем (сначала глубина, на основе extenion и т.д.), но если вы пойдёте по этому маршруту, вы можете также бросить cpio и записать файл tar с помощью модуля python's tarfile.

2
27.01.2020, 20:00

С zsh, вместо:

pax -w dir

Используйте:

pax -dw dir dir/**/*(D)

То же самое можно сделать с последними версиями bash -O globstar -O dotglob с:

pax -dw dir/**

Или с последними версиями FIGNORE='@(. |...)' ksh93 -o globstar with:

pax -dw dir dir/**

pax - стандартная команда для создания tar файлов. Вывод идет в stdout. Глобусы оболочки сортируются по имени.

Если вы столкнулись с ошибкой Arg list too long, вы можете изменить ее на:

printf '%s\0' dir dir/**/*(D) | pax -0dw

(однако не все реализации pax поддерживают -0).

3
27.01.2020, 20:00

Теги

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