Linux - 命令行批量操作的场景

88 阅读1分钟

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 失败"
'