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

ayu*_*ava 4 linux tar find

假设我们有 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
Run Code Online (Sandbox Code Playgroud)

我想搜索 28 Feb 的文件并将其压缩。

find ./ -type f -ls | grep 'Feb 28' | tar -czf somefile3.tar --null -T -
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

Sté*_*las 11

使用 GNU 或 FreeBSDfind和 GNU 或 BSD tar

find . -type f -newermt 2018-02-28 ! -newermt 2018-03-01 -print0 |
  tar -cf file.tar --null -T -
Run Code Online (Sandbox Code Playgroud)

(请注意,它不包括在精确的纳秒 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
Run Code Online (Sandbox Code Playgroud)

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

find . -type f -printf '%Tm-%Td-%p\0' |
  sed -nz 's/^02-28-//p' |
  tar -cf file.tar --null -T -
Run Code Online (Sandbox Code Playgroud)

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