我在 CIFS 共享上有一个包含 10000 多个文件的目录,其中包含许多采用以下格式的服务器日志文件CCLLLTTTFFFFNNN YYYY-MM-DD
最低限度。在哪里:
- 服务器名称由以下部分组成:
CC
= ISO 国家名称LLL
= 位置(最近城市的 IATA 代码)TTT
=WIN
或UNX
(以及为什么它是 CIFS 共享)FFFF
= 服务器的功能nnn
= 数字
- 空间
- 一个约会
- 有时更多文本包含带有空格的单词
- 扩展(总是)
不再为公司工作的人设置了此设置,全球所有服务器都将其每日日志转储到此处并且加载文件列表需要很长时间! 每个需要日志的人都在抱怨和抱怨 发牢骚关于这件事,但没有人做任何事,所以我开始做某物关于它只为我。
想法:
与其使用一长串文件,为什么不使用一个简短的目录列表(至少短 2 个数量级,其中包含服务器名称)以及cron
每天将所有这些文件移动到该目录中的脚本?^
我有什么?
bash
- 进入
gcc
- 对 CIFS 共享的写访问权限(显然)
- Manjaro,Arch 衍生品
- 开发办公室
到目前为止我做了什么?
ls /mnt/logshare/*UNXSAP* > ~/Documents/logs/logshare.txt
- 将 logshare.txt 导入 OpenOffice Calc
- 使用服务器名称创建目录
mv
使用 Calc 和公式生成大量命令
- 将其复制粘贴到 shell 脚本中
- 执行 shell 脚本
但:
- 我已经成为自己成功的受害者
- 安全和应用程序组看到了我的目录突然出现,希望我不要成为一个利己主义者,并为之而这样做。每个人。
- 没有真正的开发人员,没有真正的脚本编写者。
- 我已经思考这个问题一周了,甚至不知道从哪里开始。
awk
?find
?再次开始编写 C 代码吗? (已经有 20 多年没有这样做了。不幸的是,我变成了我一直害怕的样子:一套西装...) ;-( - 每当添加新服务器时,都会自动创建一个目录
- 脚本应该每天运行
有没有人已经为自己的服务器/数据文件集合解决了这个问题,并且已经有这样一个bash
脚本(C 源?)方便我可以修改?如果没有:请提供有用的提示?
注1:是的,明智的做法是让服务器将日志转储到以服务器名称命名的目录中,但这需要部署、CAB 以及其他令人头痛的问题,例如动员全球所有服务器管理员。 ..
答案1
为每个服务器创建目录
find /var/mnt/logshare/ -maxdepth 1 -type f | cut -d' ' -f1 | sort -u |
while read server ; do
mkdir "$server"
done
我们所做的:
-type f
在 logshare 目录中搜索文件(并且仅搜索文件),而不是其子目录 (-maxdepth 1
)- 服务器名称是文件名的第一个空格分隔的部分,所以我们
cut
知道 - 仅排序并保留
-u
唯一的条目 - 为每个点击创建一个目录
相应地移动文件
find /var/mnt/logshare -maxdepth 1 -type d |
while read server ; do
mv "$server?*" "$server"
done
- 在日志共享中搜索目录,但不进行更深层次的搜索
- 目录名称等于日志文件名称的第一部分
- 将任何被称为服务器但更长的东西移动到目录
答案2
尝试,
cd /path/to/files/ || exit
for f in *' '*; do
mkdir -p -- "${f%% *}" &&
mv -- "$f" "${f%% *}/"
done