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

13

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

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

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

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

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

Есть идеи?

Райан П
источник

Ответы:

17

Я согласен с vonbrand. Глобирование обрабатывается оболочкой, в которой вы работаете. Поэтому scp user@machine:/path/*/ path / * будет расширяться до файлов в LOCAL / path / *, а не на удаленной машине.

Впрочем, просто ради ухмылки я попробовал:

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

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

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

супермагическим
источник
1

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

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

vonbrand
источник
Этот ответ неверен. Пожалуйста, удалите :)
Майкл
1

Я обнаружил, что на старых машинах 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
Райан П
источник
Оба решения работают для меня на сервере 11.11.
DarkHeart
0

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

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

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

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Жиль "ТАК - перестань быть злым"
источник