tar:如何在打包后删除文件但保留目录

tar:如何在打包后删除文件但保留目录

我想要 tar 打包一个完整的目录

tar cvjf dir.tbz dir

但让它删除所有文件

tar cvjf dir.tbz dir --remove-files

但是这也会删除 ./dir。因此,我在打包之前尝试 cd 进入目录

tar cvjf dir.tbz --remove-files -C dir .

但这仍然会删除 ./dir... 这对我来说没有任何意义,因为 tar 为什么要删除工作目录本身? 我不能打包一个完整的目录并在打包后删除文件而不删除整个目录吗?

我有一个正在运行的进程,它不断在 ./dir 中创建文件,并希望每小时打包所有文件,然后删除已打包的文件。我可以在 tar 和 delete 之后 mkdir,但这可能会导致创建文件的另一个进程在 mkdir 重新创建目录之前尝试写入新文件时出现问题。

答案1

您可以尝试这样的事情:

find dir -type f -mmin +1 | xargs -I{} sh -c 'tar rvf dir.tar {} && rm {}'
bzip2 dir.tar && mv dir.tar.bz2 dir-$(date +%F-%T).tbz

它比您当前的命令稍微复杂一些,但是可以工作,而且我认为它不存在任何竞争问题(前提是文件没有被多次写入,且间隔不超过一分钟)。

find命令查找 中dir至少一分钟前的所有文件(因此当前没有写入)。然后,此列表通过管道传输到xargs,依次将每个文件添加到dir.tar文件中。成功将文件添加到 tar 文件后,将删除原始文件。如果文件数量很多,一次执行一个操作可以避免命令行过长的问题。最后,您可以压缩并重命名 tar 文件。

答案2

我现在的解决方法如下:

我编写了一个脚本,使用 cds 进入目录并使用 ./* 将内容打包,然后删除。我只是希望 -C 可以做同样的事情,这样我就可以在一个命令行中完成它,但事实并非如此。

#!/bin/bash

cd /path/to/dir
tar cvjf dir.tbz ./* --remove-files

应该管用。

相关内容