-1

У меня есть 200 000 файлов XML в папке на сервере Linux RHEL7. Мне нужно сжать все 200 000 файлов XML. Я использую команду Tar, но получаю сообщение об ошибке "Список аргументов слишком длинный", есть ли другой способ в этих 200 000?

tar -cvf xml.tar *.xml

Все XML-файлы должны быть заархивированы отдельно как отдельный архив с оригинальным именем файла в имени архива.

Исходные файлы:

1.xml
2.xml
...
n.xml

Результат архивации ОП хочет:

1.xml.tgz
2.xml.tgz
...
n.xml.tgz

1 ответ1

1

Вы превысили максимальную длину командной строки. Командная строка имеет конечную длину, которую вы можете проверить с помощью команды getconf ARG_MAX . Когда вы запускаете команду оболочки с шаблоном глобуса, например * в каталоге, содержащем огромное количество файлов, командная строка переполняется, и вы получите сообщение об ошибке "Список аргументов слишком длинный", так что это не проблема tar . Имейте это в виду, когда вы используете другие команды с шаблонами глобусов, которые применяются к огромному количеству файлов.

Чтобы решить вашу проблему, вы можете использовать программу find которая будет "ходить"
через каталог и подачу tar .

Для архивирования всех файлов в виде одного сжатого архива tar вы можете использовать:

find . -name "*.xml" -print | tar -czvf xml.tgz -T -

Чтобы архивировать все файлы по отдельности в виде сжатых tar-архивов (не совсем понятно, зачем нужно tar'ed, если это один файл, но по вашему желанию), используйте

find . -name "*.xml" -exec tar -czvf '{}'.tgz '{}' \;

Для архивирования всех файлов по отдельности в виде архивов gzip используйте:

find . -name "*.xml" -exec gzip '{}' \;

Будьте осторожны, команда выше удалит оригинальные файлы (!!!)

Для архивирования всех файлов по отдельности в виде zip-архивов используйте:

find . -name "*.xml" -exec zip '{}'.zip '{}' \;

PS я добавил тоже пропустил (?) возможность сжать архив tar.

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