Risposte:
Non c'è davvero alcuna differenza sostanziale tra l'uso di una barra finale o non in generale per una directory, tranne nella gestione dei collegamenti simbolici. Vedi le specifiche di base del gruppo aperto, 4.11 Risoluzione del nome del percorso (vedi anche questa risposta su Unix SE).
Per quanto riguarda il tar GNU: una barra finale non viene semplicemente gestita in --exclude
schemi, come hai notato. La differenza è semplicemente causata dal suo codice sorgente specifico, se si dovrebbe puntare a qualcosa :-). Vedi questa domanda su Server Fault SE (anche se non fornisce molti dettagli - indica semplicemente il fatto). Vedi questo thread di posta per alcune informazioni correlate. Un indizio potrebbe essere trovato in questo passaggio (anche se non sono del tutto sicuro di cosa farne):
Otto Moerbeek ha scritto:
Questo è il pezzo di codice che è rilevante:
/* * Some programs that create ustar archives append a '/' * to the pathname for directories. This clearly violates * ustar specs, but we will silently strip it off anyway. */ if (arcn-> name[arcn-> nlen - 1] == '/') arcn-> name[--arcn-> nlen] = '\0';
Come puoi vedere con hexdump -C degli archivi creati da gtar, gtar è un tale programma. Non ho voglia di cambiare tar solo per accogliere programmi non conformi.
Di solito, dipende dalla convenzione del programma. Con (GNU) tar
è un po 'incoerente perché un trailing / non cambia le directory incluse . Il comportamento è in parte spiegato qui " modelli e nomi sono usati così come sono ". Le esclusioni possono corrispondere a qualsiasi parte di un nome (a meno che tu non lo usi --anchor
).
La documentazione non è chiara dell'esistenza di una differenza o del perché.
Internamente, il motivo per cui un finale / non corrisponde in un escludere è che tar
usi opendir(3)
, readdir(3)
e fnmatch(3)
- opendir()
accetta finale /
su una directory, readdir()
non mettere una barra sui nomi delle directory, e fnmatch()
semplicemente partite modelli senza riguardo per i file o canonica esistenti. In particolare, fnmatch("proc/","proc",0)
restituisce 1 (nessuna corrispondenza).
Confronta rsync
che ha distinzioni molto distinte (e ben documentate) per i nomi di directory finali / su.
Un problema correlato è che a volte si desidera eseguire il backup di una directory perché è un punto di montaggio , anche se non si desidera il suo contenuto. L'intento del backup può contenere tutti i punti di montaggio richiesti ( /dev
proc
/sys
), quindi di solito si vorrebbe fare:
tar --exclude=/proc/* --exclude=/sys/* --exclude=/dev/* [...]