confunda sobre find - opção print e prune (unix)

0
compa> find . -type d
.
./2015_08_30
./2015_08_25
./2015_08_27
./2015_08_31
./2015_08_24
./2015_08_26


compa> find . -type d -print
.
./2015_08_30
./2015_08_25
./2015_08_27
./2015_08_31
./2015_08_24
./2015_08_26

q1) Eu não vejo nenhuma diferença com ou sem o -print. Por que usamos -print então?

================= Em seguida, quero ver a pasta 2015_08_31 a ser excluída.

compa> find . -name "2015_08_31"
./2015_08_31
compa> find . -name "2015_08_31" -prune
./2015_08_31

Somente se eu colocar uma impressão por trás da poda, então funciona

find . -name "2015_08_31" -prune -o -print

q2) Por quê? O que é realmente -o? Eu acredito que é um "ou"?

Mais uma vez, adicionar um -o -name muda tudo novamente.

compa> find . -name "2015_08_31" -prune -o -name "2015_08_30"
./2015_08_30
./2015_08_31

q3) Por que está mostrando 08_30 e 08_31 quando eu especifico podar "2015_08_31"?

    
por Noob 31.08.2015 / 11:19

2 respostas

0

A ação padrão para find é print, e é por isso que você não vê nenhuma diferença com ou sem o comando print no exemplo inicial.

Eu tenho que admitir que eu nunca usei -prune , mas ao ler a man page, parece que não faz o que você acha que faz.

-prune True; if the file is a directory, do not descend into it.

Isso significa que quando uma correspondência for encontrada, neste caso em "2015_08_31", o find não descerá no diretório para continuar encontrando arquivos. Como o diretório de nível superior corresponde e find não precisa descer nele, ele ainda executará a ação.

Todos os exemplos subseqüentes parecem derivar desse equívoco sobre o que -prune faz ou como find realmente funciona.

Se você quiser que find simplesmente não imprima esse diretório, tente

find . -type d ! -name "2015_08_31"

Nesse comando, find imprimirá os nomes de todos os diretórios abaixo. exceto "2015_08_31". No entanto, esse comando imprimirá todos os subdiretórios em "2015_08_31".

Se você quiser encontrar para não mostrar nada a ver com esse diretório, você pode tentar

find . -type d ! -regex "./2015_08_31.*"
    
por 31.08.2015 / 14:34
0

q1) I do not see any difference with or without the -print. Why do we use -print then ?

-print é a ação padrão de nenhuma outra ação ser especificada. Na página do manual:

   If the expression contains no actions other than -prune, -print is per‐
   formed on all files for which the expression is true.

q2) Why ? What is actually -o ? I belive it is a "or" ?

Da página do manual:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

q3) Por que está mostrando 08_30 e 08_31 quando eu especifico podar "2015_08_31"?

A ação -prune impedirá que find desça para esses diretórios, mas não os excluirá da saída. Considere a seguinte estrutura de arquivos:

.
./2015_08_31
./2015_08_30
./2015_08_30/test_dir
./2015_08_30/test_dir/test_file_1
./2015_08_30/test_dir/test_file_3
./2015_08_30/test_dir/test_file_2

Em exibição:

find . -name "2015_08_31" -prune -o -name "2015_08_30"

mostrará:

./2015_08_31
./2015_08_30

Ou seja, find não desce para os diretórios prune d.

    
por 31.08.2015 / 14:35

Tags