Как scp с регулярными выражениями

Я пытаюсь скопировать все файлы, которые не начинаются с буквы «a», в ksh.

Копирование с исходного компьютера на конечный компьютер работает нормально :

scp -p !(a*) user@machine:/path/directory/.

Но, если я нахожусь на целевом сервере и хочу скопировать с исходного сервера, он не работает:

scp -p user@machine:/path/!(a*) .

Есть идеи?

4 Solutions collect form web for “Как scp с регулярными выражениями”

Я согласен с фонбрендом. Таким образом, scp user@machine:/path/* будет расширяться / path / * к файлам в LOCAL / path / *, а не на удаленном компьютере.

Однако, только для усмешек я попробовал:

 scp "user@machine:/path/[regex here]" . 

и … это сработало. Попробуй это. Обратите внимание на цитаты. Очень необходимо. Дайте нам знать.

Примечание. Учетная запись пользователя на удаленном компьютере может по умолчанию использовать другую программу оболочки, чем ваша , поэтому правила расширения wild-карты могут быть разными, поэтому «используйте это.

Это не «scp с регулярными выражениями», тот, который обрабатывает файлы globs, является оболочкой. scp просто scp уже расширенный список файлов. И расширение происходит на машине, где выполняется команда.

Извините, не могу (легко) сделать.

Я обнаружил, что на старых машинах HP-UX (parisc 11.11) мне пришлось использовать [^ a] * Но на более новых машинах (parisc 11.31 и новее) он работает с! (A *)

Это то, чем я закончил. И это работает:

  if [[ ${S_MACH} = "phd026a" || ${S_MACH} = "tht030a" ]] then scp -p -r ${S_MACH}:${S_DIR}/bin/[^a^b^c^p]* ${D_DIR}/bin/. else scp -p -r ${S_MACH}:${S_DIR}/bin/!((a*)|(b*)|(c*)|(p*)) ${D_DIR}/bin/. fi 

Удаленные имена, переданные в scp , фактически интерпретируются как список шаблонов, разделенных пробелами на удаленной стороне. Это часто раздражает, когда вы пытаетесь скопировать файл, чье имя содержит пробелы, но здесь оно полезно: scp -p 'user@machine:/path/a*' . скопирует все файлы, чье имя начинается с.

Ваша команда будет работать, если вы укажете шаблон так, чтобы он интерпретировался удаленно, а не локально, при условии, что вы пройдете другое препятствие. Шаблон !(a*) A !(a*) не является базовым шаблоном оболочки, это расширение ksh (что bash и zsh также поддерживают, если вы установите соответствующий параметр). Таким образом, это будет работать, только если ваша удаленная оболочка – ksh, а не какая-то другая оболочка, и вы выполняете exec ksh из .profile или что-то подобное.

Легкий способ, если вы не в какой-то ограниченной или античной среде, – это забыть о scp . Вы хотите, чтобы удаленные файлы работали так же, как локальные файлы, поэтому сделайте их локальными файлами: смонтируйте удаленный каталог с помощью sshfs . Для этого требуется FUSE на локальном компьютере и SFTP-сервер (т. sftp-server Исполняемый файл sftp-server который запускается sshd ) на удаленном компьютере.

 mkdir ~/net/machine sshfs user@machine:/ ~/net/machine cp -p ~/net/machine/path/!(a*) . 
  • SSH сломанная трубка, неверный код аутентификации сообщения
  • Передача файлов через хост-хост
  • Копирование последнего файла с удаленного сервера
  • Проблемы с scp, если я использую bashrc для открытия рыбы, если она присутствует
  • Файлы SCP без взаимодействия с пользователем
  • В чем разница между протоколами SFTP, SCP и FISH?
  • Как написать файл через ssh
  • Параметры MaxStartups и MaxSessions для ssh-соединений?
  • Короткий путь к scp с использованием одного и того же файла / источника в исходном и целевом
  • cp: не может stat: нет такого файла или каталога
  • scp между двумя серверами не в одной сети
  • Linux и Unix - лучшая ОС в мире.