添加到 tar 存档后删除文件

Posted

技术标签:

【中文标题】添加到 tar 存档后删除文件【英文标题】:Deleting files after adding to tar archive 【发布时间】:2012-05-28 08:34:05 【问题描述】:

GNU tar 是否可以将许多文件添加到存档中,并在添加时删除每个文件?

当没有足够的磁盘空间来保存整个 tar 存档和原始文件时,这很有用 - 因此无法在以通常方式创建存档后简单地手动删除文件。

【问题讨论】:

目录中存在的所有文件都必须压缩吗? man tar 不回答你的问题吗? 是的,我有一个名为 images 的目录。我正在执行 tar cvjf images.tar.bz2 images/ 但磁盘空间不足。 一个解决方案是对整个文件进行 ftp 到另一台机器-> 归档它--> 然后将“归档文件”移回同一台机器 我不想这样做,因为有很多文件,我可能需要再做一次,甚至更多 【参考方案1】:

对于 GNU tar,使用 option --remove-files

【讨论】:

您确定使用此标志会在将每个文件添加到存档后删除它,而不是在进程结束时删除所有文件吗? @EugeneS:我检查了 GNU tar 源代码,在归档和删除之间存在一些(可配置的)延迟,但 tar 不会等待整个 tarball 被创建。 bsdtar 怎么样?有人吗? 效果很好。通过 pg_dump -Fd 帮助进行备份【参考方案2】:

我有一个任务 - 存档文件,然后删除到没有 GNU 选项的安装“tar”的操作系统中。

方法:

使用“xargs”

假设,我们有一个包含文件的目录。 需要在一周内将所有文件移动到 tar 中并将其删除。 我做了一个存档 (arc.tar) 并向其中添加了文件。 (您可以每次尝试创建新存档)

解决办法:

find ./ -mtime +7 | xargs -I % sh -c 'tar -rf arc.tar % && rm -f %'

【讨论】:

1.我会在tarrm 命令之间使用&& 而不是;,因此只有在成功添加到存档时才删除文件。 2. 如果您的find 有,请考虑使用-exec 选项。 ***.com/a/6043896/711006【参考方案3】:

对于非 GNU tar,您可以使用“-u”循环处理每个文件的文件

tar -cf archive.tar afile
for myfile in dir/*.ext
do
    tar -uf archive.tar $myfile && rm $myfile || echo "error tar -uf archive.tar $myfile"
done

【讨论】:

欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释,并说明适用的限制和假设。【参考方案4】:

我不确定您是否可以在不先解压缩的情况下将文件添加到 bzip2 档案中。然而,这是我刚刚想到的一种解决方案(给你伪算法):

1. For each [file] in [all small files]
    1.1 compress [file] into [file].bz2
    1.2 (optionally verify the process in some way)
    1.3 delete [file]
2. For each [bzfile] in [all bzip files from step 1]
    2.1 append to tar (tar rvf compressedfiles.tar [bzfile]
    2.2 (optionally verify the process in some way)
    2.3 delete [bzfile]

现在您应该有一个 tar 文件,其中包含所有单独的 bzip2:ed 文件。问题是 bzip2 给单个文件增加了多少开销。这需要测试。

【讨论】:

以上是关于添加到 tar 存档后删除文件的主要内容,如果未能解决你的问题,请参考以下文章

添加到tar后删除文件

Zip - 添加较新的文件和文件夹,删除旧的

列出和删除存档中的目录

将文件添加到 tar 存档而不先保存

节点:将字符串作为文件添加到 tar 存档中(没有临时文件)

Linux解压命令(tar)