带有先前查找结果的 Unix Tar 命令

带有先前查找结果的 Unix Tar 命令

假设我们有 4 个文件:

a.zip created on 28 feb 2018
b.zip created on 28 feb 2018
c.zip created on 2 mar 2018
d.zip created on 2 mar 2018

我想搜索 2 月 28 日的文件并对其进行 Tar。

find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -

但这不起作用。

答案1

对于 GNU 或 FreeBSDfind和 GNU 或 BSD tar

find . -type f -newermt 2018-02-28 ! -newermt 2018-03-01 -print0 |
  tar -cf file.tar --null -T -

(请注意,它排除了最后在精确纳秒 2018-02-28T00:00:00.000000000 修改的文件(并且可能包括第二天的文件),这在具有纳秒粒度的文件系统上几乎永远不会发生,除非文件是使用touch -t/创建的touch -d,或者本身是从不存储亚秒精度时间戳的档案中提取的)

POSIXly 并假设文件名不包含换行符(标准 tar 存档格式对文件名也有额外的限制):

touch -d 2018-02-28T00:00:00 .start
touch -d 2018-03-01T00:00:00 .end
find . -type f -newer .start ! -newer .end ! -path ./.start ! -path ./.end |
  pax -x ustar -w > file.tar

如果您想要使用 GNU 工具在 2 月 28 日(而不仅仅是 2018 年)最后修改的所有常规文件:

find . -type f -printf '%Tm-%Td-%p\0' |
  sed -nz 's/^02-28-//p' |
  tar -cf file.tar --null -T -

的输出find -ls不能自动可靠地进行后处理,它仅供人类使用。

答案2

使用star,您的命令行看起来:

touch -t201802280000 ref
star -c -f file.tar -find . -newer ref

顺便说一句:-newermt 可能是libfind.

如果您也喜欢结束日期:

touch -t201802280000 start
touch -t201802282359.59 end
star -c -f file.tar -V pat='start!end' -find . -newer start ! -newer end

请注意,您要么必须省略一秒,要么如果年份是闰年,则可能会得到两天。

由于 2018 年不是闰年,您可以使用touch -t201803010000 end.

答案3

我只是想添加你的命令不起作用的原因

find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -

find 的输出是文件名以及日期等其他信息的列表。 Grep 输出带有匹配日期的整行。 Tar 只需要文件名,并且需要用空字节而不是换行符分隔。

答案4

find日期选项。你尝试过那些吗?

-newermt 最后修改日期

-newerat上次访问日期

-newerct 权限更改的最后日期

例如: find . -newermt 2018-07-10 ! -newermt 2018-7-11 | xargs tar -cfv file.tar 编辑 作为查尔斯·达菲评论,以避免这个问题: find . -newermt 2018-07-10 ! -newermt 2018-7-11 -print0 | xargs -0 tar -cfv file.tar

相关内容