O que este comando faria: “find. -ls \ (pattern \) ”?

3

Eu sei para que serve o comando find, mas não consigo descobrir se os parênteses servem. Por favor explique.

    
por David Vlcek 06.03.2017 / 23:04

1 resposta

7

Esse é um recurso do find que permite agrupar diferentes testes juntos. Por exemplo:

find . \( -name foo -or -name bar -o -name baz \) -size +1M

Os parênteses precisam ser escapados ( \( e \) em vez de ( e ) ) porque os parênteses são caracteres especiais para o shell (eles são usados para executar comandos em subshells ), portanto eles precisam ser ignorados para serem passados para find e não "comidos" pela shell.

O comando acima encontrará qualquer arquivo cujo nome seja foo , bar ou baz e cujo tamanho seja > 1M Agora, pegue esta estrutura de diretórios como exemplo:

$ ls -lh *
dir1:
total 2.0M
-rw-r--r-- 1 terdon terdon 1.0M Mar  7 01:24 bar
-rw-r--r-- 1 terdon terdon 1.0M Mar  7 01:24 foo

dir2:
total 4.0M
-rw-r--r-- 1 terdon terdon 2.0M Mar  7 01:24 file
-rw-r--r-- 1 terdon terdon 2.0M Mar  7 01:24 foo

Existem dois ficheiros com o nome foo , mas apenas um tem > 1M de tamanho. Existem 2 arquivos com tamanho de > 1M, mas apenas um é denominado foo , bar ou baz . Portanto, espero que o comando acima retorne apenas dir2/foo , como de fato:

$ find . \( -name foo -or -name bar -o -name baz \) -size +1M
./dir2/foo

OK, mas e se eu executar sem os parênteses?

$ find .  -name foo -or -name bar -o -name baz  -size +1M
./dir2/foo
./dir1/bar
./dir1/foo

Encontram-me todos os ficheiros com o nome foo , todos os ficheiros com o nome bar e todos os ficheiros com o nome bar cujo tamanho é > 1M . Portanto, os bar e foo em dir1 são retornados, embora seu tamanho seja < 1M

Portanto, os parênteses são muito úteis para criar um comando find que combina diferentes conjuntos de testes. Quando combinado com os operadores -or , -and e -not do find, isso é uma ferramenta extremamente poderosa.

O que eles fazem no seu exemplo eu não posso dizer, já que você não dá um comando de trabalho como exemplo. Dependerá de qual pattern é. Se você realmente estiver usando find . -ls e, depois disso, outro conjunto de testes entre parênteses, eles não farão nada, pois find . -ls já corresponde e lista todos os arquivos e diretórios.

    
por terdon 07.03.2017 / 00:30