Qual é a diferença entre / proc e / proc / (com uma barra final)?

2

Eu tento usar tar para fazer backup dos meus arquivos. Com --exclude=/proc/ , o arquivo contém arquivos em / proc e --exclude=/proc não. O que causa a diferença?

P.S. O shell que eu uso é Bash.

    
por Noverull 02.02.2013 / 15:26

2 respostas

2

Não há realmente nenhuma grande diferença entre o uso de uma barra final ou não em geral para um diretório, exceto no tratamento de links simbólicos. Veja Especificações básicas do grupo aberto, 4.11 Resolução do nome do caminho (veja também esta resposta no Unix SE).

Como o GNU tar está relacionado: uma barra final simplesmente não é manipulada em --exclude padrões, como você notou. A diferença é simplesmente causada pelo seu código fonte específico, se alguém apontar para algo :-). Veja esta questão no Server Fault SE (embora não forneça muitos detalhes - apenas declara a facto). Consulte este tópico de e-mail para obter algumas informações relacionadas. Uma pista pode ser encontrada nesta passagem (embora eu não tenha certeza do que fazer com isso):

Otto Moerbeek wrote:

This is the piece of code that is relevant:

            /*
             * 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] = '%bl0ck_qu0te%';

As you can see with hexdump -C of archives created by gtar, gtar is such a program. I do not feel like changing tar just to accomodate non-conforming programs.

    
por 02.02.2013 / 17:31
3

Normalmente, é a convenção do programa. Com (GNU) tar é um pouco inconsistente porque um diretório / não altera os diretórios incluídos . O comportamento é parcialmente explicado aqui " padrões e nomes são usados como estão ". Excludes podem corresponder a qualquer parte de um nome (a menos que você use --anchor ).

A documentação não está clara de que haja uma diferença ou por quê.

Internamente, o motivo pelo qual / não corresponde em uma exclusão é que tar usa opendir(3) , readdir(3) e fnmatch(3) - opendir() aceita / em um diretório, readdir() não coloca uma barra nos nomes dos diretórios e fnmatch() simplesmente corresponde aos padrões sem considerar os arquivos existentes ou a canonização. Especificamente, fnmatch("proc/","proc",0) retorna 1 (sem correspondência).

Compare rsync , que tem distinções muito distintas (e bem documentadas) para nomes de diretórios trailing / on.

Um problema relacionado é que às vezes você deseja fazer o backup de um diretório porque é um ponto de montagem , embora não queira seu conteúdo. A intenção de ser seu backup pode conter todos os pontos de montagem necessários ( /dev proc /sys ), normalmente você gostaria de fazer:

tar --exclude=/proc/* --exclude=/sys/* --exclude=/dev/* [...]
    
por 02.02.2013 / 18:06

Tags