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?
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:
źródło
Zdalne nazwy przekazywane
scp
są 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ę oda
.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 tyexec ksh
z.profile
lub 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-server
Pliku wykonywalnego, którysshd
uruchamia się) na komputerze zdalnym.źródło