GNU/Linux >> Linux Esercitazione >  >> Linux

Filtro Rsync:copiare un solo pattern?

Sto cercando di creare una directory che conterrà tutti e solo i miei PDF compilati da LaTeX. Mi piace tenere ogni progetto in una cartella separata, il tutto racchiuso in una grande cartella chiamata LaTeX . Quindi ho provato a eseguire:

rsync -avn *.pdf ~/LaTeX/ ~/Output/

che dovrebbe trovare tutti i pdf in ~/LaTeX/ e trasferirli nella cartella di output. Questo non funziona. Mi dice che non ha trovato corrispondenze per "*.pdf “. Se tralascio questo filtro, il comando elenca tutti i file in tutte le cartelle del progetto sotto LaTeX. Quindi è un problema con il filtro *.pdf. Ho provato a sostituire ~/ con il percorso completo della mia home directory, ma ciò non ha avuto effetto.

Sto usando zsh. Ho provato a fare la stessa cosa in bash e anche con il filtro che elencava ogni singolo file in ogni sottodirectory... Cosa sta succedendo qui?

Perché rsync non comprende il mio filtro solo pdf?

OK. Quindi aggiorna:No, ci sto provando

rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/

E questo mi dà l'intero elenco di file. Immagino perché tutto corrisponde al primo schema...

Risposta accettata:

TL,DR:

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Rsync copia le sorgenti nella destinazione. Se superi *.pdf come sorgenti, la shell lo espande all'elenco dei file con .pdf estensione nella directory corrente. Non si verifica alcun attraversamento ricorsivo perché non hai passato alcuna directory come origine.

Quindi devi eseguire rsync -a ~/LaTeX/ ~/Output/ , ma con un filtro per dire a rsync di copiare .pdf solo file. Le regole del filtro di Rsync possono sembrare scoraggianti quando leggi il manuale, ma puoi costruire molti esempi con poche semplici regole.

  • Inclusioni ed esclusioni:

    • E' facile escludere i file per nome o per posizione:--exclude=*~ , --exclude=/some/relative/location (relativo all'argomento sorgente, ad esempio questo esclude ~/LaTeX/some/relative/location ).
    • Se vuoi abbinare solo alcuni file o posizioni, includili, includi tutte le directory che li portano (ad esempio con --include=*/ ), quindi escludi il resto con --exclude='*' . Questo perché:
    • Se escludi una directory, questo esclude tutto ciò che si trova al di sotto di essa. I file esclusi non verranno affatto presi in considerazione.
    • Se includi una directory, questa non include automaticamente il suo contenuto. Nelle versioni recenti, --include='directory/***' lo farà.
    • Per ogni file si applica la prima regola di corrispondenza (e tutto ciò che non corrisponde mai è incluso).
  • Modelli:

    • Se un pattern non contiene un / , si applica al nome del file sans directory.
    • Se un pattern termina con / , si applica solo alle directory.
    • Se un pattern inizia con / , si applica all'intero percorso dalla directory che è stata passata come argomento a rsync .
    • * qualsiasi sottostringa di un singolo componente di directory (cioè non corrisponde mai a / ); ** corrisponde a qualsiasi sottostringa del percorso.
  • Se un argomento sorgente termina con un / , il suo contenuto viene copiato (rsync -r a/ b crea b/foo per ogni a/foo ). Altrimenti viene copiata la directory stessa (rsync -r a b crea b/a ).

Correlati:quando useresti un descrittore di file aggiuntivo?

Quindi qui dobbiamo includere *.pdf , includi le directory che li contengono ed escludi tutto il resto.

rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Nota che questo copia tutte le directory, anche quelle che non contengono file corrispondenti o sottodirectory che ne contengono uno. Questo può essere evitato con --prune-empty-dirs opzione (non è una soluzione universale poiché quindi non puoi copiare una directory anche abbinandola esplicitamente, ma è un requisito raro).

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Linux
  1. Sed:stampa solo la prima occorrenza di una corrispondenza di pattern?

  2. Registrazione solo di file trasferiti con Rsync?

  3. Rsync sta cambiando le autorizzazioni della directory?

  4. Slash e il comando rsync

  5. Configurazione di DRBD con un solo nodo

Come usare Rsync

Come inserire una directory il cui nome è solo un meno?

Modo per sincronizzare solo una partizione?

Come assicurarsi che venga eseguita solo un'istanza di uno script Bash?

Sincronizzare due tipi di file in un comando?

Esempi di comandi Linux rsync