假设我们有 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