Cara scp dengan ekspresi reguler

13

Saya mencoba menyalin semua file yang tidak dimulai dengan huruf "a", di ksh.

Menyalin dari mesin sumber ke mesin tujuan bekerja dengan baik :

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

Tetapi, jika saya berada di server tujuan dan ingin menyalin dari server sumber, gagal:

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

Ada ide?

Ryan P
sumber

Jawaban:

17

Saya setuju dengan vonbrand. Globing ditangani oleh shell yang Anda jalankan. Jadi scp user@machine:/path/*akan memperluas / path / * ke file di LOCAL / path / *, bukan pada mesin jarak jauh.

Namun, hanya untuk menyeringai saya mencoba:

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

dan .... itu berhasil. Coba itu. Perhatikan kutipannya. Sangat penting. Beritahu kami.

Catatan: akun pengguna pada mesin jarak jauh mungkin default ke program shell yang berbeda dari Anda , jadi aturan ekspansi kartu liar mungkin berbeda, jadi perbaiki itu.

SuperMagic
sumber
1

Ini bukan "scp dengan ekspresi reguler", yang menangani gumpalan file adalah shell. scpbaru saja menyerahkan daftar file yang sudah diperluas. Dan ekspansi terjadi pada mesin tempat perintah dijalankan.

Maaf, tidak bisa (dengan mudah) melakukannya.

vonbrand
sumber
Jawaban ini salah. Silakan hapus :)
Michael
1

Apa yang saya temukan adalah bahwa pada mesin HP-UX yang lebih lama (parisc 11.11), saya harus menggunakan [^ a] * Tapi, pada mesin yang lebih baru (parisc 11.31 dan yang lebih baru) ia bekerja dengan! (A *)

Inilah yang akhirnya saya lakukan. Dan itu bekerja:

    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
Ryan P
sumber
Kedua solusi bekerja untuk saya di server 11,11.
DarkHeart
0

Nama jarak jauh yang dilewati scpsebenarnya ditafsirkan sebagai daftar pola yang dipisahkan oleh spasi di sisi jarak jauh. Ini sering menjengkelkan ketika Anda mencoba menyalin file yang namanya mengandung spasi, tetapi ini berguna: scp -p 'user@machine:/path/a*' .akan menyalin semua file yang namanya dimulai dengan a.

Perintah Anda akan bekerja jika Anda mengutip polanya sehingga ditafsirkan dari jarak jauh daripada lokal, asalkan Anda melewati rintangan lain. Polanya !(a*)bukan pola shell dasar, ini adalah ekstensi ksh (yang bash dan zsh juga mendukung jika Anda mengatur opsi yang sesuai). Jadi ini hanya akan berfungsi jika shell jarak jauh Anda adalah ksh, tidak jika itu shell lain dan Anda exec kshdari .profileatau yang serupa.

Cara mudah, kecuali Anda berada di lingkungan yang terbatas atau antik, adalah melupakannya scp. Anda ingin file jarak jauh berfungsi seperti file lokal, jadi buatlah file lokal: mount direktori jarak jauh dengan sshfs . Ini membutuhkan FUSE pada mesin lokal dan server SFTP (yaitu sftp-serverexecutable yang sshddiluncurkan) pada mesin jarak jauh.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Gilles 'SANGAT berhenti menjadi jahat'
sumber