shell - 按日期将日志文件移动到存档文件夹,但不是每个进程的最后一个日志文件
问题描述
我有这些文件,[processName.DateTime.out]
/stev/log: ls -al
drwxrwxr-x 1 user.stev user 4096 Feb 5 23:59 .
drwxrwxr-x 1 user.stev user 4096 Feb 5 23:59 ..
-rw-rw-r-- 1 user.stev user 4096 Jan 21 23:59 AAA01.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 22 23:59 AAA01.202002020000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 23 23:59 AAA01.202002030000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 1 23:59 BBB01.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 2 23:59 BBB01.202002020000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 3 23:59 BBB01.202002030000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 1 23:59 DDD01.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 2 23:59 DDD01.202002020000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 3 23:59 DDD01.202002030000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 1 23:59 TEST01.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 2 23:59 TEST01.202002020000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 3 23:59 TEST01.202002030000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 1 23:59 TEST02.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 2 23:59 TEST02.202002020000.out
-rw-rw-r-- 1 user.stev user 4096 Feb 3 23:59 TEST02.202002030000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 21 23:59 TEST03.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 22 23:59 TEST03.202002020000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 23 23:59 TEST03.202002030000.out
如果在 7 天之前修改了我的脚本,我的脚本会将一些文件移动到存档文件夹。
sfind . -type f -mtime +7 -name "/stev/log" | while read FNAME
do
echo " moving file: " ${FNAME} >> /stev/archive/archiveLog.log
PCMD="mv ${FNAME} /stev/archive}"
echo "PCMD=${PCMD}" >> /stev/archive/archiveLog.log
eval "${PCMD}" >> /stev/archive/archiveLog.log
echo "" >> /stev/archive/archiveLog.log
done
此脚本将列出以下文件,然后将它们移动到存档文件夹 [当前日期:2 月 5 日]
-rw-rw-r-- 1 user.stev user 4096 Jan 21 23:59 AAA01.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 22 23:59 AAA01.202002020000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 23 23:59 AAA01.202002030000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 21 23:59 TEST03.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 22 23:59 TEST03.202002020000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 23 23:59 TEST03.202002030000.out
但问题是,我必须保留每个进程的最后一个文件。
例如)我可以移动下面的文件
-rw-rw-r-- 1 user.stev user 4096 Jan 21 23:59 AAA01.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 22 23:59 AAA01.202002020000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 21 23:59 TEST03.202002010000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 22 23:59 TEST03.202002020000.out
但我应该保留以下文件(无论多少天前,都必须保留每个进程的最后一个文件。)
-rw-rw-r-- 1 user.stev user 4096 Jan 23 23:59 AAA01.202002030000.out
-rw-rw-r-- 1 user.stev user 4096 Jan 23 23:59 TEST03.202002030000.out
这个问题有什么好主意吗?
解决方案
在 bash 中像在“流”中一样思考 - 有东西进去,有东西出去。
# find all files
find /stev/log -type f -mtime +7 |
# extract the part before dot
cut -d. -f1 |
# for each process
# could be transformed into `xargs sh -c '...' --` for speed
while IFS= read -r process; do
# all files with this process
find /stev/log -type f -mtime +7 -name "$process*" |
# sort numerically second field behind dot
sort -t. -n -k2 |
# remove last file, because we don't want to move it
# maybe you need to remove first line, then just sort -r, check it
head -n -1
done |
# mv each file into /stev/archive
xargs -d$'\n' -I{} mv -v {} "/stev/archive" >> /stev/archive/archiveLog.log
传递-t
选项xargs
来调试它。
推荐阅读
- javascript - 如何从 discord.js 中的 JSON 对象中检索消息作为对象?
- sharepoint-online - 更新列表和库控件中的总计
- ruby-on-rails - Puma 和 byebug/pry 在并发请求期间导致终端损坏
- mysql - SQL从表中获取每个项目的最新记录
- javascript - 标签不合适的自定义复选框
- yii2 - Yii2 - 如何在 gii(ant) 生成的视图中引用主模型,在关系选项卡下?
- android - 在firebase中获取文件的链接会像下载操作android Java一样花费我们
- docker - 如何将 docker 插件保存到文件中,以便可以在没有互联网的机器上安装它
- java - 使用 sendkey 在 textarea 中输入 python 代码,但不起作用。任何解决方案?(硒Java)
- excel - AD 中的姓氏不能与 PowerShell 一起使用