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 建议的分叉听起来很合理,最新的分叉覆盖了生成的文件 - 该文件包含文件的“尾部” - 7773到9999。
结果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 tar
unbuntu,-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)
归档时间: |
|
查看次数: |
1864 次 |
最近记录: |