Переданные удаленные имена 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*) .