我想按特定月份压缩日志文件。使用以下命令列出所有文件
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'
,尽管该文件也将与用户/组/匹配)文件名/符号链接目标包含Sep
或oim_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
用于压缩)。xz
tar
如果您想归档过滤后的输出中显示的文件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 Sep
。Sep
这包括用户和组名、文件名和符号链接的目标。 Sep
仅在某些英语语言环境中用于最后一次修改于 9 月的文件。- 就像
Sep
上面的一样oim_server
,可以在线任何地方找到 - 文件名可以包含换行符,因此假设文件名仅占一行在一般情况下是错误的。
- 更糟糕的是,
awk '{print $NF}'
打印每行的最后一个单词。这意味着它不适用于包含空格的文件名或符号链接(它将输出符号链接目标的最后一个单词)