如何为这种存档场景编写代码?

如何为这种存档场景编写代码?

def假设第一次运行后,目录中使用用户 ID 创建了 10 个文件abc。我将按用户 ID 创建的 10 个文件打包def成一个带有日期时间戳扩展名的 tar 文件。

def现在,经过第二次运行后,目录中的列表中又按用户 ID 创建了另外 4 个文件abc

现在,当我第二次 tar 时,我不想再次 tar 前 10 个文件,我只想 tar 新添加的 4 个文件。

目录中现在应该有 2 个 tar 文件abc

在第三次运行中,第三个 tar 文件应该仅包含第二次运行后新添加的文件。

我怎样才能做到这一点?

答案1

一个简单的方法需要你有一个起始标记文件或者你的 tarball 目录中有一个现有的 tarball。本质上这只是将开始时间设置为我们的 tarball 操作的基础:

touch sentinel.tar

然后,要打包您要查找的文件,您只需在目录树的基本目录中运行以下命令:

find . -type f -newer $( ls -1rt *.tar | tail -1 )  \! -name '*.tar' -exec tar cavf "$( date '+%Y%m%d%H%M%S').tar" {} +

这应该会导致 tarball 以当前日期/时间作为名称,其中包含自上次将文件打包以来创建的所有文件。

例子:

helter@helter-desktop:~/workspace/tmp$ touch sentinel.tar
helter@helter-desktop:~/workspace/tmp$ ls -la
total 12
drwxr-xr-x  3 helter helter 4096 2011-07-12 16:18 .
drwxr-xr-x 33 helter helter 4096 2011-07-12 15:52 ..
drwxr-xr-x  2 helter helter 4096 2011-07-12 16:17 abc
-rw-r--r--  1 helter helter    0 2011-07-12 16:18 sentinel.tar

helter@helter-desktop:~/workspace/tmp$ # create some files in the abc sub dir

helter@helter-desktop:~/workspace/tmp$ touch abc/1 abc/2 abc/3

helter@helter-desktop:~/workspace/tmp$ # now tar all the files that were created after our sentinal

helter@helter-desktop:~/workspace/tmp$ find . -type f -newer $( ls -1rt *.tar | tail -1)  \! -name '*.tar' -exec tar cavf "$( date '+%Y%m%d%H%M%S').tar" {} +
./abc/3
./abc/1
./abc/2

helter@helter-desktop:~/workspace/tmp$ ls -la
total 16
drwxr-xr-x  3 helter helter 4096 2011-07-12 16:18 .
drwxr-xr-x 33 helter helter 4096 2011-07-12 15:52 ..
-rw-r--r--  1 helter helter  143 2011-07-12 16:18 20110712161854.tar
drwxr-xr-x  2 helter helter 4096 2011-07-12 16:18 abc
-rw-r--r--  1 helter helter    0 2011-07-12 16:18 sentinel.tar

helter@helter-desktop:~/workspace/tmp$ # now create some more files

helter@helter-desktop:~/workspace/tmp$ touch abc/4 abc/5 abc/6

helter@helter-desktop:~/workspace/tmp$ # and re-run the command to tar up all the new files

helter@helter-desktop:~/workspace/tmp$ find . -type f -newer $( ls -1rt *.tar | tail -1)  \! -name '*.tar' -exec tar cavf "$( date '+%Y%m%d%H%M%S').tar" {} +
./abc/6
./abc/4
./abc/5

helter@helter-desktop:~/workspace/tmp$ ls -la
total 20
drwxr-xr-x  3 helter helter 4096 2011-07-12 16:19 .
drwxr-xr-x 33 helter helter 4096 2011-07-12 15:52 ..
-rw-r--r--  1 helter helter  143 2011-07-12 16:18 20110712161854.tar
-rw-r--r--  1 helter helter  142 2011-07-12 16:19 20110712161930.tar
drwxr-xr-x  2 helter helter 4096 2011-07-12 16:19 abc
-rw-r--r--  1 helter helter    0 2011-07-12 16:18 sentinel.tar

在创建第一个 tarball 之后,您可以删除 sentinel 文件。只需确保始终将创建的最后一个 tar 文件留在根目录中。

如果您不喜欢哨兵文件的想法,您可以使用一些简单的 bash 脚本来解决这些限制/假设......

相关内容