Part01:批量删除失效的软连接
需求场景:红底白字,并且一闪一闪的都是失效的软连接,我想要批量清除它们...
【01】打印所有失效软连接
find ./* -type l -exec test ! -e {} \; -exec echo {} \;
【02】批量清除失效软连接
find /path/to/search -type l -exec test ! -e {} \; -exec rm {} \;
Part02:批量重命名文件
需求场景:将当前目录下所有以 .txt 结尾的文件,其扩展名改为 .bak。
【01】命令
for file in *.txt; do mv "$file" "${file%.txt}.bak"; done
【02】解释
-
for file in *.txt:循环遍历所有.txt文件。 -
${file%.txt}:是 Shell 参数扩展,表示从$file变量值中删除末尾的.txt。 -
mv ...:执行重命名操作。
【03】更强大的工具
# 在基于 Debian/Ubuntu 的系统上,通常叫 `rename` 或 `prename`
rename 's/\.txt$/.bak/' *.txt
Part03:批量压缩日志文件
需求场景:将 /var/log 目录下所有超过 7 天且以 .log 结尾的文件进行压缩以节省空间。
【01】命令
find /var/log -name "*.log" -mtime +7 -exec gzip {} \;
【02】解释
-
-mtime +7:查找修改时间在 7 天以前的文件。 -
-exec gzip {} \;:对找到的每一个文件(用{}代替)执行gzip命令进行压缩。
Part04:查看集群中磁盘使用率超过阈值的信息
需求场景:查看集群中主机名为
data开头的服务器磁盘使用率超过80%的信息
【01】命令
for host in $(getent hosts | awk '{print $2}' | grep '^data'); do ssh $host "df -h | awk 'NR>1 && \$5+0>80 {print \"节点: '$host' | 分区:\" \$1 \" | 挂载点:\" \$6 \" | 使用率:\" \$5 \" | 容量:\" \$2 \" | 已用:\" \$3 \" | 可用:\" \$4}'" 2>/dev/null; done
getent hosts | awk '{print $2}' | grep '^data':过滤主机名以data开头的服务器
【02】效果
节点 分区 挂载点 使用率 已用/总容量
data01 /dev/sda1 / 85% 85G/100G
data01 /dev/sdb1 /data 92% 1.8T/2.0T
data02 /dev/sda1 /var 81% 81G/100G
data03 /dev/sdc1 /opt 90% 900G/1.0T
注意:要在可以SSH免密到集群所有服务器的节点上执行命令
Part05:批量配置SSH免密
需求场景:有50台服务器(node01、node02...node50)需要在node01配置到所有服务器的SSH免密。
【01】在node01上安装sshpass
# 安装 sshpass(如果尚未安装)
yum install -y sshpass # CentOS/RHEL
# 或
apt-get install -y sshpass # Ubuntu/Debian
centos6.x和centos7.x的iso文件中默认是没有sshpass的包的,需要额外下载rpm包安装
【02】批量配置SSH免密
# 使用 sshpass 并行执行
getent hosts | awk '{print $2}' | grep -v '^node01$' | xargs -I{} -P10 sshpass -p '你的密码' ssh-copy-id -o StrictHostKeyChecking=no {}
【03】如果是纯离线场景
# 生成密钥
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
# 并行配置(同时处理5台服务器)
getent hosts | awk '{print $2}' | grep -v '^node01$' | xargs -I{} -P5 bash -c '
host={}
expect -c "
set timeout 20
spawn ssh-copy-id -o StrictHostKeyChecking=no root@$host
expect {
\"*password:\" { send \"你的密码\r\"; exp_continue }
\"yes/no\" { send \"yes\r\"; exp_continue }
eof
}
" > /dev/null 2>&1 && echo "✓ $host 成功" || echo "✗ $host 失败"
'