Qual è la differenza tra / proc e / proc / (con una barra finale)?


2

Provo a utilizzare tarper il backup dei miei file. Con --exclude=/proc/, l'archivio contiene file in / proc e --exclude=/procnon lo è. Che cosa causa la differenza?

PS La shell che uso è Bash.

Risposte:


2

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 --excludeschemi, 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.


3

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 tarusi 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 rsyncche 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/* [...]
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.