【问题标题】:How do I tar a folder or directory with all of it's files except leave out files from certain folders?除了遗漏某些文件夹中的文件外,如何使用所有文件对文件夹或目录进行 tar?
【发布时间】:2015-01-28 16:17:09
【问题描述】:

到处寻找解决方案,但找不到。不知何故,我总是在尝试没有人想到的独特场景。诡异的。无论如何,这是场景......

foldertop (keep)
-foldersub (keep)
--foldersubsub (keep)
----foldersubsubsub (keep)
------files (exclude)
----files (exclude)
--files (keep)
-files (keep)

我想压缩所有目录和子目录。我想要整个文件夹结构,但我不想要所有文件。我想保留一些文件夹中的一些文件,而忽略其他目录中的其他文件。

我唯一知道要做的就是像这样排除我不想要的文件的文件夹:

tar -cvf bak_1-28-15.tar --exclude=foldertop/foldersub/foldersubsub foldertop

也许我可以添加一个星号来保留 foldersubsub 目录并排除其中的所有文件,如下所示:

tar -cvf bak_1-28-15.tar --exclude=foldertop/foldersub/foldersubsub/* foldertop

但这也将排除 foldersubsubsub 目录。我想排除 foldersubsubsub 中的所有文件,但保留 foldersubsubsub 目录。

我该怎么做?

在没有 find 方法的情况下尝试了这个。不起作用:

tar -cvf bak_1-28-15.tar --exclude=foldertop/foldersub/foldersubsub/* --include=foldertop/foldersub/foldersubsub/foldersubsubsub --exclude=foldertop/foldersub/foldersubsub/foldersubsubsub/* foldertop

我得到的错误是:

tar: unrecognized option '--include=foldertop/foldersub/foldersubsub/foldersubsubsub'

把 include 放在最后也没有用,它仍然是一个无法识别的选项。

tar -cvf bak_1-28-15.tar --exclude=foldertop/foldersub/foldersubsub/* --exclude=foldertop/foldersub/foldersubsub/foldersubsubsub/* --include=foldertop/foldersub/foldersubsub/foldersubsubsub foldertop

将文件夹放在末尾而中间没有包含也不起作用。不给和报错,但是foldersubsubsub目录不包括在内。

tar -cvf bak_1-28-15.tar --exclude=foldertop/foldersub/foldersubsub/* --exclude=foldertop/foldersub/foldersubsub/foldersubsubsub/* foldertop foldertop/foldersub/foldersubsub/foldersubsubsub

接下来要尝试star*.star*,所以我只定位文件而不是文件夹。像这样:

tar -cvf bak_1-28-15.tar --exclude=foldertop/foldersub/foldersubsub/*.* --exclude=foldertop/foldersub/foldersubsub/foldersubsubsub/*.* foldertop

这似乎成功了。这对我有用,因为不会有没有点的文件,也不会有以点开头的文件。

【问题讨论】:

  • 我假设模式尝试不起作用?目前尚不清楚您是否尝试过但失败了,或者“但是……”是否在谈论上一次尝试。您可以使用查找/等。构建文件列表并将其传递给 tar 而不是直接从文件夹名称递归。
  • 没有费心去测试一个星号,因为这不是我想要的。它很接近但并不完美。我需要在提取后手动添加那些 subsubsub 文件夹。上面这个例子很简单。有更多的 subsub 文件夹有自己的 subsubsub 文件夹。
  • 哦...我错过了最后一句话中额外的sub。对不起。是的,我可能会使用find 来构建类似这样的文件列表。
  • 不知道怎么用 find 那么多。有例子吗?
  • 而不是--include 尝试在命令行末尾添加这些目录? (比如foldertop?)

标签: linux shell unix command-line


【解决方案1】:
find foldertop | grep -v "foldersubsubsub/files" | xargs tar -cvf tarFileName.tar

应该这样做。

【讨论】:

  • 这对于我认为的实际目标来说过于简单化了,使用xargs 有潜在危险,因为如果找到的文件的文件名长度超过命令长度限制xargs 将产生多个@987654324 @ process 和第二个将踩在第一个命令输出上。
  • 也许,如果你害怕长度限制,先放一个空的tar,然后使用xargs -i tar -uvf
  • -r 可能比-u 更好(我假设-u 需要先扫描现有的tar 存档)但是是的,这会有所帮助。话虽如此,如果您可以将-T /dev/stdin(或类似的)与tar一起使用,那么xargs就没有必要了。
  • 嗯.. 是的。 stdin 很好。但是,我不确定它是否可以处理所有类型的文件,如果不是全部的话,至少是二进制文件。如果他们可以,是的,你可以雇用他们。
  • 您不是通过stdin 将文件发送到 tar,而是通过标准输入发送名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多