find com -prune deixa nomes de diretório removidos

0

Eu construí o seguinte comando de localização:

find ./ \( -path "*work*" -o -path "*ncvlog_lib*" \) -prune -o -type f -not
-name "*.wlf" -not -name "*.vcd" -not -name "*.sim" -not -name "*vcs*"

O comando é invocado em uma única linha. Eu quebrei a linha aqui por legibilidade.

O único problema é que ele imprime os nomes dos diretórios removidos, apesar de fornecer o argumento -type f. Exemplo de saída:

./cdl2verilog_files/test_synth/work
./cdl2verilog_files/test_synth/some_file1.txt
./cdl2verilog_files/test_synth/something_else.txt
./cdl2verilog_files/test_synth/another_file.v

work é um diretório. Seu conteúdo não é incluído na saída, portanto, a remoção funciona conforme necessário. No entanto, o diretório em si é impresso. Eu não consigo encontrar uma solução para isso. Alguma idéia?

Estou usando o tcsh.

    
por ocmob 21.02.2018 / 10:52

2 respostas

0

-prune exclui o conteúdo do diretório, mas não o próprio diretório. Isso acontece se -prune for a única ação em um comando find . Se houvesse qualquer outra ação (por exemplo, -exec ou -print ), ela não produziria os nomes de diretório removidos. Por exemplo:

find ./ \( -path "*work*" -o -path "*ncvlog_lib*" \) -prune -o -type f  \
  -not -name "*.wlf" -not -name "*.vcd" -not -name "*.sim" -not -name "*vcs*" \
  -print

BTW, você pode encurtar / simplificar seu comando find usando um único predicado -regex em vez de vários predicados -name . por exemplo,

find ./ \( -path "*work*" -o -path "*ncvlog_lib*" \) -prune -o -type f \
  -regextype awk -not -regex '.*\.(wlf|vcd|sim)$|.*vcs.*' -print

Isso produz uma saída idêntica à da primeira versão acima.

    
por 21.02.2018 / 11:22
0

Eu acho que no seu caso

-prune -o -type f

é ambigus: -o significando "or", quando find encontra um diretório, o -prune é verdadeiro, então -type f não é avaliado

    
por 21.02.2018 / 11:06

Tags