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?

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.


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ć.


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

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*) .
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.