我退休了,但我曾经在大学教书。我本应该销毁所有学生成绩记录(这是法律规定),但我刚刚注意到我的许多备份中都有我多年来在学校的主目录。其中包括学生问题解决方案和成绩。仍未解压的那些很容易,因为目录结构允许我直接放弃解决方案和成绩。
tar 文件有点难,我想知道是否有办法让它变得简单——只需复制到另一个 tar 文件,减去一些我可以用 grep 指定的东西。我想保留我的一些研究成果,所以我不想把整个东西都扔掉。
幸运的是,所有这些东西都在磁盘上,而不是磁带上,但我有很多磁盘,现在我花了大半天的时间才挂载了每一个磁盘,并用 ls -lR 列出所有文件名。所以任何能减少工作量的方法都是值得欢迎的。
答案1
我想不出一种有选择地“复制 tar 文件的部分内容”的方法,而不涉及将档案提取到临时位置、删除不需要的文件,然后创建新的档案。
不过你可以复制所有的存档,然后根据存档内容的筛选列表有选择地从中删除文件。例如,给定一个包含以下文件的 tar 存档:
$ tar --list -f foo.tar
a/
a/c/
a/c/delete me
a/c/keep me
a/d/
a/d/keep me
a/e/
a/e/delete me
a/e/keep me
b/
b/c/
b/c/delete me
b/c/keep me
b/d/
b/d/keep me
b/e/
b/e/delete me
b/e/keep me
然后
$ cp foo.tar foo.copy.tar
现在测试一个过滤器:
$ tar --list -f foo.copy.tar --wildcards '*delete*'
a/c/delete me
a/e/delete me
b/c/delete me
b/e/delete me
tar --list
(您可以通过过滤器将输出输送grep
到更复杂的模式)。如果看起来不错,那么
$ tar --list -f foo.copy.tar --wildcards '*delete*' |
tar --delete -f foo.copy.tar --verbatim-files-from --files-from=-
检查结果
$ tar --list -f foo.copy.tar
a/
a/c/
a/c/keep me
a/d/
a/d/keep me
a/e/
a/e/keep me
b/
b/c/
b/c/keep me
b/d/
b/d/keep me
b/e/
b/e/keep me
当然,foo.tar
如果您愿意,您可以在原始版本上执行相同的操作(如果删除错误,则没有机会重做)。
请注意,对于包含换行符的文件名,它将失败;尽管--files-from
可以读取空分隔列表,但据我所知,--list
无法发出一个。同样,--delete
可能只适用于未压缩档案 - 如果您的档案是压缩的(foo.tar.gz
,foo.tar.xz
等等),那么您将需要先解压缩。