rsync copia i contenuti della directory in modo non ricorsivo


8

Sto cercando di copiare il contenuto di una serie di directory in modo non ricorsivo su un altro sistema remoto.

/dirA/dir1/file
/dirA/dir2/file
/dirA/dir3/file

dir1, dir2 e dir3 contengono molte directory che non voglio copiare. Copia sull'host remoto in / dirB mantenendo la stessa struttura di directory.

Provai:

rsync /dirA/*/ host:/dirB/
rsync /dirA/   host:/dirB/

Ma non fanno quello che voglio.

Risposte:


20

rsync consente di specificare modelli che attivano l'inclusione o l'esclusione di file e directory. Penso che tu voglia usare qualcosa del genere:

rsync -a -f '- /*/*/' /dirA/ host:/dirB/

Spiegazione:

  • -aattiva la modalità di archiviazione che attiva sia la ricorsione che la conservazione di "collegamenti simbolici, dispositivi, attributi, autorizzazioni, proprietà, ecc.", secondo man rsync.
  • -fè l'abbreviazione di --filter=, che aggiunge una regola di filtro dei file.
    • Il modello è racchiuso tra virgolette singole in modo che la shell non espanda i caratteri jolly; le virgolette doppie funzionerebbero ugualmente bene in questo caso.
    • - significa che questo è un modello di esclusione.
    • Il primo /indica che il modello deve iniziare da dirA/(il "transfer-root" rsync).
    • La */*parte del modello si riferisce a qualsiasi cosa all'interno di una sottodirectory.
    • Il trailing /limita l'esclusione alle directory. I file all'interno di una sottodirectory di dirA/non sono interessati.

Quindi, alla fine, rsync copia nient'altro che un livello inferiore (e inoltre non crea directory di secondo livello).


2
Molto bella! Sono stato in grado di utilizzare -f '- /*/'per limitare solo ai file di livello superiore. Ho anche dovuto specificare -f '- .*'di escludere i file dot, poiché stavo sincronizzando una directory home.
Haridsv,

5

La soluzione sopra (di PleaseStand) non ha funzionato per me per qualche motivo. Questo ha funzionato però:

rsync -avc --no-r ./source/* ./destination/

C'è anche questa alternativa:

rsync -avc --exclude "/" ./source/ ./destination/


1

Una delle "caratteristiche" di rsync è il modo in cui vengono analizzate le directory.

rsync /dirA/ host:/dirB/ e rsync /dirA host:/dirB dovrebbe teoricamente essere equivalente.

Come non voler incoraggiare la ricorsività, si desidera evitare -r, -acosa che implica oltre ad altre cose -r.

Non ho ancora finito con la ricerca, ma questa è la mia risposta iniziale.

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.