scp
и rsync
передайте удаленные имена файлов удаленной оболочке. Это позволяет Вам передавать шаблоны, как в
scp remotehost:'*.txt' .
но это имеет противное последствие, что Вам нужно дополнительное заключение в кавычки при предоставлении удаленного имени файла.
Можно передать -s
опция к rsync
заставить его защитить имена файлов от расширения удаленной оболочкой. Но это включает встроенное подстановочное расширение rsync, таким образом, все еще необходимо заключить в кавычки \[?*
.
Обходное решение должно передать архив:
ssh -P 8484 root@172.31.72.103 'cd "/media/New Volume" && tar cf - lj' |
tar xf - -C /home/pratheep
Другой метод должен смонтировать удаленную файловую систему и затем использовать обычные инструменты для выполнения копии.
mkdir mnt
sshfs -p 8484 root@172.31.72.103:/ mnt
cp -Rp 'mnt/media/New Volume/lj' /home/pratheep
fusermount -u mnt
rmdir mnt
С немного дополнительным переписывают. (Поскольку Вы используете определенное для Bash регулярное выражение, просто заполняете BASH_REMATCH
массив вместо того, чтобы управлять разделением слова.)
checkIp()
{
local ip="$1"
if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
for ((i=1;i<=4;i++)); do
[[ "${BASH_REMATCH[i]}" == '*' || "${BASH_REMATCH[i]}" -le 255 ]] || return 1
done
return 0
fi
return 1
}
Обновление согласно комментарию владельца для запрещения чисел после “*”:
checkIp()
{
local ip="$1"
local asterisk=''
if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
for ((i=1;i<=4;i++)); do
[[ "${BASH_REMATCH[i]}" == '*' || ( ! "$asterisk" && "${BASH_REMATCH[i]}" -le 255 ) ]] || return 1
[[ "${BASH_REMATCH[i]}" == '*' ]] && asterisk='1'
done
return 0
fi
return 1
}
Для записи, с zsh, Вы могли записать это:
[[ $ip = <0-255>.(<0-255>|"*").(<0-255>|"*").(<0-255>|"*") ]]
Обратите внимание, что это позволяет 000001.0000255.*.0
, но нет 0377.1.1.1
(даже при том, что 0377
столь взятый, как восьмеричное число в диапазоне), потому что это только рассматривает десятичные числа.