我想逐个运行命令来更改服务器上目录的名称。
当我运行脚本时,服务器 1 中的目录被重命名。但是在服务器 2 中找不到目录。
脚本中可能存在什么错误?
脚本;
#!/bin/bash
mach_directory=/home/user/example
erase_dir1=cache
erase_dir2=tmp
for i in {0..10}
do
user=user
server=$(ssh $user@server$i hostname)
ssh $user@$server find $mach_directory -type d -name $erase_dir1 ! -path "*Admin/$erase_dir1*" -print0 | while IFS= read -r -d '' file ; do mv "$file" "${file}_$(date +%d%m%Y)"; done
ssh $user@$server find $mach_directory -type d -name $erase_dir2 ! -path "*Admin/$erase_dir2*" -print0 | while IFS= read -r -d '' file ; do mv "$file" "${file}_$(date +%d%m%Y)"; done
done
答案1
您要么需要在其中进行大量转义,因为您的大部分代码都是在运行脚本的机器上本地执行的,要么将所有脚本放在“ssh $user@$server”之后的文件中,将其复制到所有服务器并执行它。
另外,你可能想看看并行 ssh。
编辑:
在这种情况下,所有带有 $ 的命令以及管道和等号都将在运行脚本的机器上本地执行。这意味着它将只在远程计算机上执行 find 命令,并在本地执行脚本的其余部分。
答案2
编辑:我已交换引号。
在 ssh 参数后引用命令
ssh $user@$server "find $mach_directory -type d -name $erase_dir1 ! -path '*Admin/$erase_dir1*' -print0 | while IFS= read -r -d '' file ; do mv '$file' '${file}_$(date +%d%m%Y)'; done"
(并且我将字符串中的双引号改为单引号。)