Jak scp z wyrażeniami regularnymi

13

Próbuję skopiować wszystkie pliki, które nie zaczynają się na literę „a”, w ksh.

Kopiowanie z komputera źródłowego na komputer docelowy działa poprawnie :

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

Ale jeśli jestem na serwerze docelowym i chcę skopiować z serwera źródłowego, oznacza to, że:

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

Jakieś pomysły?

Ryan P.
źródło

Odpowiedzi:

17

Zgadzam się z vonbrandem. Globowanie jest obsługiwane przez powłokę, w której się uruchamiasz. Zatem scp user@machine:/path/*rozwinięcie / path / * do plików w LOCAL / path / *, nie na zdalnym komputerze.

Jednak tylko dla uśmiechów próbowałem:

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

i .... zadziałało. Spróbuj tego. Zwróć uwagę na cytaty. Bardzo potrzebne. Daj nam znać.

Uwaga: konto użytkownika na zdalnym komputerze może domyślnie mieć inny program powłoki niż twój , więc zasady rozszerzania dzikiej karty mogą być inne, więc pamiętaj o tym.

SuperMagic
źródło
1

To nie jest „scp z wyrażeniami regularnymi”, tym, który obsługuje globusy plików, jest powłoka. scpotrzymuje tylko rozwiniętą listę plików. Rozbudowa odbywa się na komputerze, na którym uruchomiono polecenie.

Przepraszam, nie mogę (łatwo) zrobić.

vonbrand
źródło
Ta odpowiedź jest zła. Proszę usunąć :)
Michael
1

Odkryłem, że na starszych komputerach z systemem HP-UX (parisc 11.11) musiałem użyć [^ a] * Ale na nowszych komputerach (parisc 11.31 i nowszych) to działa z! (A *)

Właśnie z tym skończyłem. I to dział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
Ryan P.
źródło
Oba rozwiązania działają dla mnie na serwerze 11.11.
DarkHeart
0

Zdalne nazwy przekazywane scpsą w rzeczywistości interpretowane jako lista wzorców oddzielonych spacjami po stronie zdalnej. Jest to często denerwujące, gdy próbujesz skopiować plik, którego nazwa zawiera spacje, ale tutaj jest użyteczny: scp -p 'user@machine:/path/a*' .skopiowałby wszystkie pliki, których nazwa zaczyna się od a.

Twoje polecenie zadziała, jeśli zacytujesz wzór, aby interpretować go zdalnie, a nie lokalnie, pod warunkiem, że przejdziesz kolejną przeszkodę. Wzorzec !(a*)nie jest podstawowym wzorcem powłoki, jest rozszerzeniem ksh (ten bash i zsh obsługują również, jeśli ustawisz odpowiednią opcję). Działa to tylko wtedy, gdy twoją zdalną powłoką jest ksh, a nie jeśli jest to jakaś inna powłoka i ty exec kshz .profilelub coś podobnego.

Łatwym sposobem, o ile nie jesteś w jakimś ograniczonym lub zabytkowym otoczeniu, jest zapomnienie scp. Chcesz, aby zdalne pliki działały tak jak pliki lokalne, więc uczyń je plikami lokalnymi: zamontuj katalog zdalny za pomocą sshfs . Wymaga to FUSE na komputerze lokalnym i serwera SFTP (tzn. sftp-serverPliku wykonywalnego, który sshduruchamia się) na komputerze zdalnym.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Gilles „SO- przestań być zły”
źródło