Як скропувати регулярними виразами


13

Я намагаюсь скопіювати всі файли, які не починаються з літери "а", в ksh.

Копіювання з вихідної машини на машину призначення працює нормально :

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

Але, якщо я перебуваю на цільовому сервері і хочу скопіювати з вихідного сервера, це не вдалося:

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

Будь-які ідеї?

Відповіді:


17

Я згоден з фонбрандом. Глобуванням керує оболонка, в якій ви працюєте. Отже, scp user@machine:/path/*буде розширено / шлях / * до файлів у LOCAL / path / *, а не на віддаленій машині.

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

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

і .... це спрацювало. Спробуйте це. Зверніть увагу на цитати. Дуже потрібно. Дайте нам знати.

Примітка. Обліковий запис користувача на віддаленій машині може бути встановлений за замовчуванням для іншої програми оболонки, ніж ваша , тому правила розширення картки можуть бути різними, тому "це потрібно.


1

Це не "scp з регулярними виразами", один з файлів, що обробляє глобуси, - це оболонка. scpпросто передає вже розширений список файлів. І розширення відбувається на машині, де виконується команда.

Вибачте, не можна (легко) зробити.


Ця відповідь неправильна. Видаліть :)
Майкл

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*) .
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.