Qual é a diferença entre encontrar. e encontra . -impressão

25

Qual é a diferença entre:

find .

e

find . -print

O que o -print realmente faz?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
    
por faressoft 22.04.2015 / 10:19

6 respostas

40

Do findutils find manpage :

If no expression is given, the expression -print is used (but you should probably consider using -print0 instead, anyway).

( -print é uma expressão find .)

A documentação do POSIX confirma isso:

If no expression is present, -print shall be used as the expression.

Portanto, find . é exatamente equivalente a find . -print ; o primeiro não tem expressão, então -print é adicionado internamente.

A explicação do que -print faz vem mais abaixo na manpage:

-print

True; print the full file name on the standard output, followed by a newline. If you are piping the output of find into another program and there is the faintest possibility that the files which you are searching for might contain a newline, then you should seriously consider using the -print0 option instead of -print. See the UNUSUAL FILENAMES section for information about how unusual characters in filenames are handled.

    
por 22.04.2015 / 10:29
20

-print é a ação padrão . Alguns predicados find são considerados ações ao contrário de filtros ou condições . Por exemplo, -type f não é uma ação. -exec é uma ação, embora também possa ser usada como uma condição.

As ações incluem -print , -exec e -ok . Algumas implementações com find têm outros predicados de ação não padrão, como -print0 , -printf , -execdir , -okdir , -ls ...

find files <some-predicates>

Onde nenhum <some-predicates> contém ações é equivalente a:

find files \( <some-predicates> \) -print

(observe os parênteses acima, que são importantes se houver alguns operadores -o ).

Em caso de dúvida, o melhor é usar -print explicitamente (ou -exec printf '%s-print0' {} + (ou -print , quando disponível) para que a saída possa ser pós-processada).

A ação find padrão é especificada por POSIX. Algumas implementações -print antigas exigiam um find explícito , mas geralmente não são encontrado na natureza hoje em dia.

Observe também que algumas implementações de files permitem omitir o find e, nesse caso, o padrão é pesquisar no diretório atual. Isto é, para eles,

find

é equivalente a

find .
find . -print

Isso não é padrão, por isso é melhor evitar.

No final mais detalhado (e útil) do espectro, algumas implementações de -f também permitem passar caminhos de arquivo como argumento para uma opção find como em:

find -f "$file1" -f "$file2" -print

Eles são as únicas implementações find que permitem a passagem de caminhos de arquivos arbitrários para ! . Outras implementações não podem aceitar caminhos de arquivo como -print ou find "$file" -print ... então find -- "$file" -print (ou mesmo $file ) assume find não é o nome de um predicado %code% (ou opção no primeiro caso) .

Infelizmente, isso também não é padrão nem portátil.

    
por 22.04.2015 / 11:06
8

Eles são os mesmos, ambos escrevem toda a hierarquia de diretórios a partir do diretório atual.

Em POSIX, encontre a documentação :

The following commands are equivalent:

find .

find . -print

    
por 22.04.2015 / 10:26
4

No Linux não há diferença, mas outros sistemas (como o AIX, por exemplo) precisam de -print se você quiser que a saída do comando seja exibida na sua tela.

    
por 22.04.2015 / 10:43
3

Por muitos anos, o comando find não teve uma ação padrão. Um erro comum foi esquecer de adicionar a opção -print ao seu comando find. Eu ainda até hoje digitando por hábito.

Mas em algum momento foi adicionado como a ação padrão, então agora find . e find . -print são equivalentes.

    
por 22.04.2015 / 18:59
1

Às vezes é útil usar -print explicitamente quando você está executando outra ação para que o nome do arquivo seja exibido conforme essa ação é executada.

find . -print -delete

seria semelhante a

rm -rfv *

em que -print corresponde a -v . Se você não incluir -print , os nomes dos arquivos não serão exibidos.

Para tornar o comando rm ainda mais semelhante, a propósito, emita este comando Bash primeiro

shopt -s dotglob

que fará com que os arquivos de% (%) de correspondência coincidam com * .

    
por 22.04.2015 / 21:21