Unix:如何仅压缩每个文件夹中的前N个文件?

4

我有一个包含2GB图像的文件夹,其中还有多层子文件夹。

我想将每个(子)文件夹中的N个文件存档到一个tar文件中。我尝试使用findtailtar,但无法使其正常工作。以下是我尝试过的方式(假设N = 10):

find . | tail -n 10 | tar -czvf backup.tar.gz

...它会输出此错误:

Cannot stat: File name too long

这里有什么问题?思考一下 - 即使它可以工作,我认为它只会将每个文件夹的前10个文件打成一个tar包,而不是每个文件夹中的前10个文件。

我如何获取每个文件夹的前N个文件?


4
您可能希望将此问题迁移到http://unix.stackexchange.com/。 - mark
你想要实现什么目标? - Ed Heal
Tar 不喜欢过长的路径/文件名组合。 - Walter A
@mark:完成了,这是链接:https://unix.stackexchange.com/questions/223748/unix-how-to-tar-only-n-first-files-of-each-folder - Sami
@EdHeal:OP在这里和unix.stackexchange.com上都问了他的原始问题。在他的Unix.SE问题的评论中,他解释了为什么要这样做。 - unforgettableidSupportsMonica
@unforgettableid - 请检查我的评论时间,8月16日10:55与您链接的问题是第二天。 - Ed Heal
1个回答

1

一个有些怪异的建议:排序仅由find的顺序决定,因此“第一”没有明确定义。

find . -type f |
awk -v N=10 -F / 'match($0, /.*\//, m) && a[m[0]]++ < N' |
xargs -r -d '\n' tar -rvf /tmp/backup.tar

gzip /tmp/backup.tar

注释:

  1. 使用find . -type f确保文件具有前导目录名前缀,以便下一步可以工作
  2. awk命令跟踪这样的前导目录名称,并发出完整路径名称,直到发出带有相同前导目录的N(这里是10)个文件为止
  3. 使用xargs调用tar——我们正在收集常规文件名称,它们需要成为该归档命令的参数
  4. xargs可能会多次调用tar,因此我们将(-r选项)附加到普通归档中,然后在全部写入后对其进行压缩
此外,您可能不想将备份文件写入当前目录,因为您正在扫描该目录 - 这就是为什么此建议会写入 /tmp 的原因。

我有一个错误信息: awk: line 1: syntax error at or near , - Sami
awk 的哪个版本呢?我的是 GNU Awk 4.1.0,它的功能可能会有所不同。 - sjnarv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接