Я хочу запустить команду одну за другой, чтобы изменить имена каталогов на сервере.
Когда я запускаю сценарий, каталоги переименовываются на сервере 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
РЕДАКТИРОВАТЬ: Я поменял кавычки местами.
Цитируйте команду после аргументов 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"
(и я изменил кавычки с двойных на одинарные внутри строки.)
Вам либо нужно сделать МНОГО экранирования там, поскольку большая часть вашего кода выполняется локально, на машине, на которой вы запускаете скрипт, либо поместите весь этот скрипт после «ssh $ user @ $ server» в файл, скопируйте его ко всем серверам и выполнить.
Также вы можете взглянуть на параллельный ssh.
РЕДАКТИРОВАТЬ:
Все, что имеет в этом случае $, а также каналы и равные, будет выполняться локально на машине, на которой вы запускаете скрипт. Это означает, что он будет выполнять только команду find на удаленном компьютере, а остальную часть сценария локально.