3

Я создаю tar и распаковываю его в другом месте, используя:

$ tar -C sourcedir -cf - . | tar -C targetdir -xpf -

но это так не получается
Ошибка, которую я получаю:Argument list too long - tar , когда я уменьшаю количество файлов, я имею в виду, что, делая это в пакетах файлов (например, 1000 файлов за раз), это работает.
Еще один момент, который я заметил:
если имена файлов короче, чем это работает хорошо.

Я не уверен, что именно это ограничивает? пожалуйста, дайте предложения.

1 ответ1

6

Слишком длинный список аргументов не является специфичной для tar ошибкой. Это ошибка (E2BIG) системного вызова execve (2) (данная ядром, которая должна накладывать некоторые ограничения на execve во избежание повреждения памяти). Таким образом, ваша оболочка (которая fork -s, а затем execve -s программу /bin/tar) сообщает об этом сообщении об ошибке.

Может быть трудно увеличить этот лимит (возможно, какой-то sysconf , я забыл детали). Или перекомпилировать ядро и увеличить ARG_MAX в его include/uapi/linux/limits.h

GNU tar(1) принимает много интересных опций (поэтому, пожалуйста, прочитайте страницу руководства), в частности:

-T, --files-from = ФАЙЛ

         Get names to extract or create from FILE.

Поэтому соберите пути к файлам, которые будут заархивированы в каком-то (например, временном) файле, затем передайте его с -T и вы не получите никаких ограничений.

Тем не менее, команда tar имеет много интересных функций, и вы можете использовать их, чтобы получить команду разумного размера.

Смотрите также find(1) и xargs(1). Также рассмотрим dar или afio (как альтернативу tar) или rsync

Вы можете использовать GNU cp(1) как cp -va sourcedir destdir

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