使用 tar 压缩 ls 结果

使用 tar 压缩 ls 结果

我想按特定月份压缩日志文件。使用以下命令列出所有文件

ll | grep 'Sep' | grep 'oim_server'

然后我需要用 tar 压缩它的结果我该怎么做?

答案1

查找九月份修改的所有文件:

find . -type f -newermt 2016-09-01 ! -newermt 2016-10-01

将文件附加到存档:

tar -rvf archive.tar filename

现在使用 exec 将两者结合起来:

find . -type f -newermt 2016-09-01 ! -newermt 2016-10-01 -exec tar -rvf logs_sept.tar {} +

答案2

如果您确实想要存档在任何一年的 9 月最后修改的非隐藏文件(包括目录的任何类型),并且其名称包含oim_server(这看起来像您的命令的意图ll | grep 'Sep' | grep 'oim_server',尽管该文件也将与用户/组/匹配)文件名/符号链接目标包含Sepoim_server),在 GNU 系统上,您可以执行以下操作:

find . -mindepth 1 -maxdepth 1 ! -name '.*' \
       -name '*oim_server*' -printf '%Tm:%p\0' |
  sed -zn 's/^09://p' |
  tar --null --no-recursion -T - -cvvf - |
  xz > file.tar.xz

--no-recursion是为了不是还存档那些目录的内容最后修改在九月的某个月份)。

请注意,它tar不会压缩,它只是存档(将带有数据和元数据的文件集中到磁带或文件上,以便以后可以按原样恢复)。您可以将其输出通过管道传输到上面的压缩器,xz以获得压缩的存档。像 GNU 这样的一些tar实现tar可以自己调用这些压缩器(-J/在最新版本的 GNU 中--xz用于压缩)。xztar

如果您想归档过滤后的输出中显示的文件ls,您可以这样做:

ll | grep Sep | grep oim_server |
  awk '{print $NF}' |
  tar  --no-recursion -T - -cvvf - |
  xz > file.tar.xz

您可以将其简化为:

ll | awk '/Sep/ && /oim_server/ {print $NF}' |
  tar  --no-recursion -T - -cvvf - |
  xz > file.tar.xz

但请注意,它有很多限制:

  • 搜索整行,而不仅仅是月份字段grep SepSep这包括用户和组名、文件名和符号链接的目标。
  • Sep仅在某些英语语言环境中用于最后一次修改于 9 月的文件。
  • 就像Sep上面的一样oim_server,可以在线任何地方找到
  • 文件名可以包含换行符,因此假设文件名仅占一行在一般情况下是错误的。
  • 更糟糕的是,awk '{print $NF}'打印每行的最后一个单词。这意味着它不适用于包含空格的文件名或符号链接(它将输出符号链接目标的最后一个单词)

相关内容