Düzenli ifadelerle scp nasıl


13

Ben ksh, "a" harfi ile başlamayan tüm dosyaları kopyalamaya çalışıyorum.

Kaynak makineden hedef makineye kopyalama düzgün çalışıyor :

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

Ancak, ben hedef sunucu ve kaynak sunucudan kopyalamak istiyorsanız, başarısız:

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

Herhangi bir fikir?

Yanıtlar:


17

Vonbrand'a katılıyorum. Globing, içinde çalıştığınız kabuk tarafından yönetilir. Böylece scp user@machine:/path/*uzak makinede değil, LOCAL / path / * içindeki dosyalara / path / * öğesini genişletir.

Ancak, sadece sırıtarak denedim:

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

ve .... işe yaradı. Bunu dene. Tırnaklara dikkat edin. Çok gerekli. Bilmemize izin ver.

Not: Uzak makinedeki kullanıcı hesabı varsayılan olarak sizinkinden farklı bir kabuk programına sahip olabilir , bu nedenle joker kart genişletme kuralları farklı olabilir, bu yüzden bunu yapın.


1

Bu "düzenli ifadeler ile scp" değil, dosya glob ele bir kabuk olduğunu. scpsadece zaten genişletilmiş dosya listesini teslim alır. Ve genişletme, komutun çalıştırıldığı makinede gerçekleşir.

Üzgünüm, yapamam (kolayca).


Bu cevap yanlış. Lütfen kaldır :)
Michael

1

Bulduğum şey, daha eski HP-UX makinelerde (parisc 11.11), [^ a] * kullanmak zorunda kaldım. Ancak, daha yeni makinelerde (parisc 11.31 ve daha yeni) birlikte çalışıyor! (A *)

Sonunda bunu yaptım. Ve çalışıyor:

    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

Her iki çözüm de 11.11 sunucusunda çalışıyor.
DarkHeart

0

İletilen uzak adlar scpaslında uzak taraftaki boşlukla ayrılmış bir desen listesi olarak yorumlanır. Bu, adı boşluk içeren bir dosyayı kopyalamaya çalıştığınızda genellikle bir sıkıntıdır, ancak burada yararlıdır: scp -p 'user@machine:/path/a*' .adı ile başlayan tüm dosyaları kopyalar a.

Deseni, başka bir engelden geçmeniz koşuluyla yerel olarak değil, uzaktan yorumlanacak şekilde alıntılarsanız, komutunuz çalışır. Desen !(a*)temel bir kabuk deseni değildir, bir ksh uzantısıdır (uygun seçeneği belirlerseniz bash ve zsh da desteklenir). Uzak kabuk bazı diğer kabuk ve sensin değilse, Ksh ise bu sadece çalışır Yani exec kshgelen .profileveya buna benzer.

Bir şekilde kısıtlı veya antika bir ortamda değilseniz, unutmanın kolay yolu scp. Uzak dosyaların aynı yerel dosyalar gibi çalışmasını istiyorsunuz, bu yüzden onları yerel dosyalar yapın: uzak dizini sshfs ile bağlayın . Bu, yerel makinede FUSE ve uzak makinede bir SFTP sunucusu (yani başlatılan bir sftp-serveryürütülebilir dosya sshd) gerektirir.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.