为什么不是所有文件都压缩了以及如何改进解决方案

kos*_*tja 8 linux zsh shell tar pipe

我有一个包含大约 20K 个文件的文件夹。这些文件根据模式命名xy_{\d1,5}_{\d4}\.abc,例如xy_12345_1234.abc. 我想使用以下命令压缩其中的前 10K:

ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz

但是生成的文件里面只有大约 2K 个文件。

ls | sort -n -k1.4,1.9 | head -n10000 | wc -l 然而,正如预期的那样返回 10000。

在我看来,我在这里误解了一些基本的东西......

我在 Linux Mint 17.1、GNU tar 1.27.1 上使用 zsh 5.0.2

编辑:

@Archemar 建议的分叉听起来很合理,最新的分叉覆盖了生成的文件 - 该文件包含文件的“尾部” - 77739999

结果xargs --show-limit Your environment variables take up 3973 bytes POSIX upper limit on argument length (this system): 2091131 POSIX smallest allowable upper limit on argument length (all systems): 4096 Maximum length of command we could actually use: 2087158 Size of command buffer we are actually using: 131072

更换-c-r-u在我的情况没有工作。错误信息是tar: Cannot update compressed archives

使用两者-r并且-u无效并且失败tar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option

更换-c-a似乎是无效的,以及与失败,同样的tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options,虽然我不认识这个问题azf,并Acdtrux似乎间断给我。

编辑2:

-T 看起来是个好方法,我也在这里找到了一个例子。

但是当我尝试

ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T - 我明白了 tar: option requires an argument -- 'T'

好吧,也许文件名没有达到 tar?但看起来他们,这样做是因为当我执行

ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T - 我明白了 tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab Cannot stat: File name too long

那么为什么 tar 看不到文件名呢?

Arc*_*mar 12

你已经达到 xargs 限制了吗?

xargs --show-limit
Run Code Online (Sandbox Code Playgroud)

尝试 :

  • 创建一个虚拟.tgz文件tar czf xy_0_10000.tar.gz /hello/world
  • 替换-czf-Azf

当 xarg 达到极限时,它会派生命令,所以你最终运行的命令是

  tar czf xy_0_10000.tar.gz file1 file2 .... file666
  tar czf xy_0_10000.tar.gz file667 file668 ... file1203
  tar czf xy_0_10000.tar.gz file1024 ... file2000
Run Code Online (Sandbox Code Playgroud)

当每个焦油覆盖前一个时,您只能获得最后一次tar c运行。

编辑:

1)根据man tarunbuntu,-a并且-r似乎等效附加是由(要么)完成的 -A, --catenate, --concatenate

2) zip(not gzip) 可用于添加文件,也许 gzip 选项可以解决问题。(使用 | xargs zip -qr xy_0_0000.zip,这将生成一个 zip 文件,而不是 .tar.gz 文件)

3)使用@rsanchez的解决方案
以适当的方式向tar添加选项很重要,请尝试

ls | sort -n -k1.4,1.9 | head -n10000 |tar -czf xy_0_10000.tar.gz -T -
Run Code Online (Sandbox Code Playgroud)

where --T -表示使用选项-T-用作参数-T(您可以在 中生成文件列表/tmp/foo.lst,然后使用-T /tmp/foo.lst


rsa*_*hez 12

没有必要xargs。如果您直接提供tar-T -选项,它将从标准输入读取文件名

例如:

... | tar -T - -czf xy_0_10000.tar.gz
Run Code Online (Sandbox Code Playgroud)