Если вы tar
каталог рекурсивно, он просто использует порядок из ОС readdir
.
Но в некоторых случаях приятно отсортировать отсортированные файлы.
Что такое хороший способ отсортировать каталог по алфавиту?
Обратите внимание, что для целей этого вопроса, gnu-tar в типичной системе Linux подходит.
Ответы:
Для GNU
tar
:Вы, вероятно, также хотите посмотреть
--preserve-order
.источник
--sort
был представлен в версии tar 1.28.--preserve-order
не имеет отношения к этому вопросу.tar: Exiting with failure status due to previous errors
ошибку. @mhsmithС
zsh
вместо:Использование:
Вы можете сделать то же самое с последними версиями
bash -O globstar -O dotglob
с:Или последние версии
FIGNORE='@(.|..)' ksh93 -o globstar
с:pax
это стандартная команда для созданияtar
файлов. Вывод идет в стандартный вывод. Шарики оболочки сортируются по имени.Если вы столкнулись с слишком длинной ошибкой списка Arg , вы можете изменить на:
(не все
pax
реализации поддерживают,-0
хотя).источник
tar
Сам не может этого сделать, поэтому вы должны создать его из правильно упорядоченного списка. В принципе, вы можете использовать параметрtar
's'-T
, но нет никакого способа указать, что имена файлов в этом списке должны заканчиваться NUL. Так что если у вас есть какие-либо имена файлов с символами новой строки в них (что разрешено), это просто сломается.Лучшим вариантом является использование
cpio
для генерации файлов, так как он принимает завершенный по NUL список имен файлов и может генерировать tar-файлы.Если ваша
tar
команда будет:Затем для того, чтобы это было отсортировано по имени, вам нужно было бы сделать (предполагая, что GNU find и cpio):
Это имеет тот недостаток, что подкаталоги размещаются между именами файлов. Вы можете проделать трюки с
find
s -printf0, указав каталог и информацию о глубине, а также отсортировав их,sort -n
но это также влияет на порядок сортировки файлов с номерами в каталоге.Если вышесказанное неудовлетворительно, вы, вероятно, могли бы использовать небольшую программу на основе Python
os.walk()
для генерации требуемого порядка с полным контролем (сначала глубина, основанная на расширении и т. Д.), Но если вы пойдете по этому пути, вы можете также отброситьcpio
и выписатьtar
файл сtarfile
модулем Python .источник