Come scp con espressioni regolari


13

Sto cercando di copiare tutti i file che non iniziano con la lettera "a", in ksh.

La copia dal computer di origine al computer di destinazione funziona correttamente :

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

Ma, se sono sul server di destinazione e voglio copiare dal server di origine, non riesce:

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

Qualche idea?

Risposte:


17

Sono d'accordo con vonbrand. Il globing è gestito dalla shell in cui si esegue. Quindi scp user@machine:/path/*espanderà / path / * ai file in LOCAL / path / *, non sul computer remoto.

Tuttavia, solo per i sorrisi ho provato:

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

e .... ha funzionato. Prova questo. Nota le virgolette. Molto necessario. Facci sapere.

Nota: l'account utente sul computer remoto potrebbe essere impostato automaticamente su un programma shell diverso dal tuo , quindi le regole di espansione dei caratteri jolly potrebbero essere diverse, quindi 'ware that.


1

Questo non è "scp con espressioni regolari", quello che gestisce i file globs è la shell. scpviene appena consegnato l'elenco dei file già espanso. E l'espansione avviene sulla macchina in cui viene eseguito il comando.

Spiacente, non posso (facilmente) farlo.


Questa risposta è sbagliata Rimuovi :)
Michael

1

Quello che ho scoperto è che su macchine HP-UX precedenti (parisc 11.11), ho dovuto usare [^ a] * Ma su macchine più recenti (parisc 11.31 e più recenti) funziona con! (A *)

Questo è quello che ho finito. E funziona:

    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

Entrambe le soluzioni funzionano per me su un server 11.11.
DarkHeart,

0

I nomi remoti passati scpvengono in realtà interpretati come un elenco di motivi separato da spazi bianchi sul lato remoto. Questo è spesso un fastidio quando si tenta di copiare un file il cui nome contiene spazi, ma qui è utile: scp -p 'user@machine:/path/a*' .copia tutti i file il cui nome inizia con a.

Il tuo comando funzionerà se citerai il modello in modo che sia interpretato da remoto piuttosto che localmente, a condizione che passi un altro ostacolo. Il modello !(a*)non è un modello di shell di base, è un'estensione ksh (che bash e zsh supportano anche se si imposta l'opzione appropriata). Quindi questo sistema funziona solo se la vostra shell remota è ksh, se non è qualche altro guscio e si exec kshda .profileo qualcosa di simile.

Il modo semplice, a meno che tu non sia in una sorta di ambiente ristretto o antico, è quello di dimenticare scp. Vorresti che i file remoti funzionassero esattamente come i file locali, quindi rendili file locali: monta la directory remota con sshfs . Ciò richiede FUSE sul computer locale e un server SFTP (ovvero un sftp-servereseguibile che viene sshdavviato) sul computer remoto.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.