我们可以在 tar 中传递的文件名数量是否有限制

rit*_*oni 3 linux tar

我正在创建一个 tar 并使用以下方法在其他位置解压它:

$ tar -C sourcedir -cf - . | tar -C targetdir -xpf -
Run Code Online (Sandbox Code Playgroud)

但它失败了,
我得到的错误是:Argument list too long - tar,当我减少文件数量时,我的意思是分批进行(例如一次 1000 个文件),它可以工作。
我注意到的另一点是:
如果文件名比它短则工作正常。

我不确定究竟是什么限制了这一点?请给出建议。

Bas*_*tch 6

参数列表太长不是特定于tar. 这是execve(2)系统调用的错误 ( E2BIG) (由内核给出,必须对其进行一些限制以避免破坏内存)。所以你的 shell(它-s 然后-s程序)告诉你那个错误消息。execveforkexecve/bin/tar

增加该限制可能很困难(也许有一些sysconf,我忘记了细节)。或者重新编译你的内核并增加ARG_MAX它的include/uapi/linux/limits.h.

GNU tar(1)接受许多有趣的选项(所以请阅读手册页),特别是:

-T, --files-from=FILE

         Get names to extract or create from FILE.
Run Code Online (Sandbox Code Playgroud)

因此,收集要存档在某个(例如临时)文件中的文件路径,然后将其传递给-T您,您将不会受到任何限制。

但是,该tar命令具有许多有趣的功能,您可以使用它们来创建合理大小的命令。

另请参阅find(1)xargs(1)。还要考虑darafio(作为 的替代tar)或rsync

您可以使用 GNU cp(1)作为cp -va sourcedir destdir

  • 不要那样做。只要学会更明智地使用`tar`。 (2认同)