Віддалені імена передаються 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*) .