Find: combine -depth com -prune para alimentar o cpio

4

Estou criando um script de backup onde alguns diretórios não devem ser incluídos no arquivo de backup.

cd /;
find . -maxdepth 2 \ 
    \( -path './sys' -o -path './dev' -o -path './proc' -o -path './media' -o -path './mnt' \) -prune \
-o -print

Isso encontra apenas os arquivos e diretórios que eu quero.

O problema é que cpio deve ser alimentado com a seguinte opção para evitar problemas com permissões ao restaurar arquivos.

find ... -depth ....

E se eu adicionar a opção -depth , os arquivos e diretórios retornados incluirão os que eu quero evitar.

Eu realmente não entendo essas frases no manual de pesquisa:

-prune True;  if  the  file is a directory, do not descend into it. If
              -depth is given, false; no  effect.   Because  -delete  implies
              -depth, you cannot usefully use -prune and -delete together.
    
por Luis 25.01.2012 / 17:48

4 respostas

5

A explicação do que o manual diz é isto:

Quando find chegar a um diretório que corresponda à sua expressão -path , -prune evitará entrar nela. Então find irá

/             ok, go inside
/home         ok, go inside
/home/xxxx    ok, go inside
/tmp          don't go inside
/var          ..etc...

Mas quando você usa -depth , ele processa o interior dos diretórios antes dos próprios diretórios. Por isso, irá corresponder ao caminho quando for tarde demais:

/home/xxxx
/home         ok, go inside (it already went)
/tmp/zzzz     didn't match "-path /tmp", so it's ok
/tmp          don't go inside (too late!)
/var          ..etc...
/

Para resolver esse problema, você pode tentar:

  1. Basta adicionar novas expressões -path com curingas. Isso tem a desvantagem de que esses subdiretórios serão percorridos de qualquer maneira, apenas não impressos (e sua passagem talvez desencadeie avisos)

    find ... \( -path './sys' -o -path './sys/*' -o -path './dev' -o -path './dev/*' ... \) -prune ...

  2. Não enumere os diretórios para evitar, enumere os que serão impressos!

    find /bin /boot /etc /home /lib ...

por 25.01.2012 / 21:35
4

a resposta da angus explica por que -depth não funciona para você e propõe soluções.

Parece que você deseja percorrer toda a instalação, mas omite sistemas de arquivos especiais como /proc e /sys e dispositivos externos. Há uma maneira melhor de fazer isso: use o -xdev primary em find para informar que ele não desça aos pontos de montagem. Se você quiser incluir alguns sistemas de arquivos montados em seu backup, liste-os explicitamente.

find / /home -xdev -depth -print
    
por 26.01.2012 / 01:34
1

Como primeiro passo, nós rejeitamos os diretórios específicos e, em seguida, chamamos find com o -depth no restante para obter o formato necessário:

cd / && \
find . -maxdepth 1 -type d \
   \( -name sys -o -name dev -o -name proc -o -name media -o -name mnt \) -prune -o \
   ! -name . -exec sh -c 'find "$1" -depth' {} {} \;
    
por 12.03.2017 / 19:51
1

Usando -regex se for suportado pelo seu find :

find . -depth [...] -regex '\./\(sys\|dev\|proc\|media\|mnt\)\(/.*\)?' -prune -o -print

Observe que -regex não é POSIX e pode não ser necessariamente suportado em todos os lugares. Além disso, o conteúdo dos diretórios ainda será percorrido.

    
por 08.03.2017 / 23:03

Tags