我正在创建一个 tar 并使用以下方法在其他位置解压它:
$ tar -C sourcedir -cf - . | tar -C targetdir -xpf -
Run Code Online (Sandbox Code Playgroud)
但它失败了,
我得到的错误是:Argument list too long - tar
,当我减少文件数量时,我的意思是分批进行(例如一次 1000 个文件),它可以工作。
我注意到的另一点是:
如果文件名比它短则工作正常。
我不确定究竟是什么限制了这一点?请给出建议。
参数列表太长不是特定于tar
. 这是execve(2)系统调用的错误 ( E2BIG
) (由内核给出,必须对其进行一些限制以避免破坏内存)。所以你的 shell(它-s 然后-s程序)告诉你那个错误消息。execve
fork
execve
/bin/tar
增加该限制可能很困难(也许有一些sysconf
,我忘记了细节)。或者重新编译你的内核并增加ARG_MAX
它的include/uapi/linux/limits.h
.
GNU tar(1)接受许多有趣的选项(所以请阅读手册页),特别是:
-T, --files-from=FILE
Run Code Online (Sandbox Code Playgroud)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