Мне нужно использовать rsync
или scp
для копирования файла или папки с файлами с удаленного сервера на компьютер.
Для копирования (синхронизации) папки с файлами я использую следующую функцию:
foldertocomp() {
rsync -avz pi@192.168.1.5:"'/home/pi/Torrents/$1'"/* "/home/comp/Torrent/$1"
}
Я могу использовать следующие функции для копирования файла:
filetocomp() {
rsync -avz pi@192.168.1.5:"'/home/pi/Torrents/$1'" "/home/comp/Torrent/"
}
ИЛИ
filetocomp() {
scp pi@192.168.1.5:"'/home/pi/Torrents/$1'" /home/comp/Torrent
}
Все эти функции работают хорошо. Но мне нужно объединить эти функции в одну функцию. Как это:
tocomp() {
Some code...
}
Функция использования:
tocomp "HERE name of folder OR name of file"
Думаю, мне нужно построить такую функцию:
tocomp() {
if "$1 is a FILE"
rsync -avz pi@192.168.1.5:"'/home/pi/Torrents/$1'" "/home/comp/Torrent/"
elif "$1 is a FOLDER"
rsync -avz pi@192.168.1.5:"'/home/pi/Torrents/$1'"/* "/home/comp/Torrent/$1"
fi
}
Но как проверить $1
это папка или файл?
Нашел такой способ: stackoverflow.com/a/4665080/10728472. Но я думаю, что этот метод не для удаленного сервера.
Как проверить $1
это папка или файл на удаленном сервере?
Ты можешь использовать stat
на удаленном хосте, как показано ниже, чтобы проверить тип. Возможно, вам придется отрегулировать stat
аргументы в зависимости от вашей удаленной ОС. Это должно нормально работать с любым типом Linux.
arg="/home/pi/Torrents/$1"
file_or_directory=`ssh pi@192.168.1.5 "stat --format=%F $arg" 2>&1`
if [ "$file_or_directory" = "directory" ] ; then
echo "$arg: is a directory"
elif [ "$file_or_directory" = "regular file" ] ; then
echo "$arg: is a file"
elif [ "$file_or_directory" = "symbolic link" ] ; then
echo "$arg: is a link"
else
echo "$arg: unknown"
fi
Ваша команда rsync для синхронизации каталога
rsync -avz pi@192.168.1.5:"'/home/pi/Torrents/$1'"/* "/home/comp/Torrent/$1"
можно записать как
rsync -avz pi@192.168.1.5:"'/home/pi/Torrents/$1'" "/home/comp/Torrent/"
Оба каталога синхронизации $1
к /home/comp/Torrent/$1
. Таким образом, вам понадобится только одна команда, она такая же, как ваша команда rsync для файла.