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