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 脚本来解决这些限制/假设......