Por que usamos 'find -depth' com 'cpio'

3

Da página info cpio :

If you wanted to archive an entire directory tree, the find command can provide the file list to cpio:

 % find . -print -depth | cpio -ov > tree.cpio

The '-depth' option forces 'find' to print of the entries in a directory before printing the directory itself. This limits the effects of restrictive directory permissions by printing the directory entries in a directory before the directory name itself.

O que essa última parte significa? Como imprimir as entradas de diretório em um diretório antes do próprio nome do diretório limita os efeitos das permissões restritivas do diretório?

    
por John Gowers 03.07.2018 / 02:20

2 respostas

1

A maioria das implementações de cpio é burra e não gerencia permissões de diretório ao descompactar arquivos.

Se um diretório não tiver acesso de gravação e o arquivo do cpio estiver na ordem usual em find , o diretório será o primeiro no cpio archive e será descompactado primeiro do cpio archive. Quando um diretório "readonly" desse tipo tiver sido descompactado e receber permissões, ele não terá permissão para colocar os arquivos quando, mais tarde, o conteúdo do diretório for visto no archive e será descompactado.

  • uma solução para esse problema cpio é criar arquivos em que o conteúdo de um diretório vem primeiro e o diretório relacionado vem depois do conteúdo. Isso faz com que cpio crie o diretório ausente (se chamado com -d para criar diretórios ausentes) com permissões padrão, extraia os arquivos dentro do archive e, posteriormente, quando o diretório for visto no archive, defina as permissões para " readonly ".

  • outra solução é extrair o arquivo com uma implementação de cpio estúpida como root , já que root tem permissão para criar arquivos, mesmo dentro de um diretório readonly.

  • a terceira solução é usar uma implementação cpio moderna, como a cpio emulação dentro de star . star lembra as permissões de diretório do arquivo, mas cria o diretório com permissões intermediárias de gravação primeiro. As permissões do diretório real lembradas são definidas com atraso por star , depois que os arquivos do arquivo foram extraídos para o diretório com permissão de gravação intermediária.

por 03.07.2018 / 07:38
-1

A versão do OSX (e, portanto, do BSD) da página find man, afirma o seguinte:

 -d      Cause find to perform a depth-first traversal, i.e., directories 
         are visited in post-order and all entries in a directory will 
         be acted on before the directory itself.  By default, find visits 
         directories in pre-order, i.e., before their contents.  Note, 
         the default is not a breadth-first traversal.

         This option is equivalent to the -depth primary of IEEE Std 
         1003.1-2001 (''POSIX.1'').  The -d option can be useful when find 
         is used with cpio(1) to process files that are contained in 
         directories with unusual permissions.  It ensures that you have 
         write permission while you are placing files in a directory, 
         then sets the directory's permissions as the last thing.

A última frase explica porque, um pouco melhor ???

A finalidade da opção -depth é forçar o find a ir fundo em todos os diretórios que encontrar até atingir os "nós folha", que serão então impressos.

NOTA: O -depth força os subdiretórios a serem processados antes de seus pais.

Utilizando a opção -depth , você está garantindo que find não será desarmado ao transportar diretórios-pai para o comando cpio , que pode ser excessivamente restritivo, e não permitir que diretórios de nível inferior obtenham criado devido ao seu userid não ter permissão para ler / executar privilégios.

  • -depth option (really a criterion that is always true) forces the output to be depth-first - that is, files first and then the directories containing them. This helps when the directories have restrictive permissions, and restoring the directory first could prevent the files from restoring at all (and would change the time stamp on the directory in any case). Normally, find returns the directory first, before any of the files in that directory.

Referências

por 03.07.2018 / 04:20

Tags