Come copio tutti i file e le directory, tranne alcuni su ssh?


23

Utilizzando la riga di comando di Linux, utilizzo il scpcomando per copiare tutti i file e le cartelle da una determinata directory. Tuttavia, non mi piace consumare larghezza di banda, per copiare cose che cambio raramente come la mia tiny_mcecartella. Qual è il trucco per copiare tutto, ma saltare un breve elenco di cartelle?

Risposte:


19

rsyncfunziona bene e, nella maggior parte dei casi, utilizza automaticamente SSH come protocollo di trasporto. Confronterà i file e caricherà solo quelli che sono stati modificati, ma è anche possibile utilizzare un elenco di esclusione per specificare i file nella struttura che non devono comunque essere risincronizzati.


rsync non usa SSH automaticamente - per farlo devi fornire i flag "-e ssh".

4
Sì, lo fa. Rilascio di Rsync 2.6.0 - La shell remota predefinita è ora "ssh" a meno che non si indichi che si desidera configurare qualcos'altro come predefinito. samba.org/rsync

12

Puoi provare rsync che copia solo i file che sono stati modificati, funziona anche su ssh.


9

L'uso rsync --excludeè la scelta più ovvia qui, ma se vuoi davvero solo inviare alcuni file o cartelle e hai qualcosa di specifico da escludere, puoi usare la shell globing con scp. Per prima cosa assicurati di avere le giuste opzioni di globing impostate nella tua shell. Per bash run shopt -s extglobe per l'uso zsh setopt ksh_glob. Quindi qualcosa del genere:

scp /path/to/folder/!(tiny_mce|other_folder|*.bak) user@host:target_path

... copierebbe tutto nella cartella sorgente tranne le cose che corrispondono al modello dato. Ovviamente puoi diventare creativo con quella parte.


7

rsync è una buona soluzione, ma se stai cercando un'alternativa:

Diciamo che abbiamo una directory "test" che contiene le directory "foo, bar, baz". In queste directory ci sono diversi tipi di file:

test
|____bar
| |____1.jpg
| |____1.png
| |____1.txt
| |____2.jpg
| |____2.png
| |____2.txt
|____baz
| |____1.avi
| |____2.avi
| |____3.png
|____foo
| |____test.blah
|____test.txt

Vogliamo copiare tutto tranne i PNG

scp $(find /location/of/test -type f ! -name "*.png") # -> Note the logical NOT!!

In questo esempio, il comando inserirà tutti i file nella stessa directory di destinazione - questo potrebbe non essere il comportamento desiderato.


1
Si noti che questa risposta funziona solo se i nomi di file e directory coinvolti non contengono caratteri speciali della shell (spazi bianchi o \[*?).
Gilles 'SO- smetti di essere malvagio' il

3

Un ottimo strumento che potresti provare è "lftp".

lftp sftp://etc.etc/ 
lftp> ls 
    --- remote listing ---
lftp> mirror -R -n local/ remote/

Puoi anche usare RSync su ssh

rsync -avzp -e ssh /this/dir/  remoteuser@remotehost:/remote/dir/

Dovrebbe funzionare.


0

Ho appena finito di scrivere come preferisco l' unisono alla sincronizzazione ogni giorno, da allora

  • non ha bisogno di un demone, diverso da ssh per il trasporto
  • mi consente di modificare i file su entrambi i lati in qualsiasi momento: più master facilmente, mentre ho solo bisogno di inviare una richiesta di sincronizzazione da un lato
  • Sono un pignolo quando si tratta di orari, attributi / permessi, softlink ecc. Nessun problema; per un progetto uso anche 4 mirror, uno dei quali è un host cygwin. Vedi il mio esempio di installazione di crontab.
  • supporta esclusioni come *.bak. Esempi nel mio file di configurazione

0

Utilizzando la copia protetta - scp

scp -r file user@host:

Per copiare molti file

scp /directory/* user@host:destinationPath

Per copiare alcuni file

scp /directory/!(*.doc) user@host:destinationPath

Copia il contenuto della directory tranne i file .doc


0

Ti consiglierei sicuramente rsync.

rsync -vra --exclude = "cosa vuoi escludere" -e cartella ssh user @ remotehost: / cartella


0

Questo è ciò che ha funzionato per me quando l'ho eseguito dal server di destinazione.

rsync -av --progress user@servername:/sourcefolder /destinationfolder --exclude thefoldertoexclude

0

Possiamo farlo in due passaggi per ignorare la tiny_mcedirectory. Supponendo che tutte le directory inizino con lettere minuscole.

scp -r USER@HOSTNAME:~/FOLDER/[a-s]* .
scp -r USER@HOSTNAME:~/FOLDER/[u-z]* .

Inoltre, cambia USER, HOSTNAME e FOLDER sui valori reali.

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.