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

27

Qual é a diferença entre:

find .

e

find . -print

O que -printrealmente 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
faressoft
fonte

Respostas:

41

Na página de findutils findmanual :

Se nenhuma expressão for fornecida, a expressão -printserá usada (mas você provavelmente deve considerar o uso -print0).

( -printé uma findexpressão.)

A documentação do POSIX confirma isso:

Se nenhuma expressão estiver presente, -print deve ser usada como expressão.

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

A explicação do que -printacontece se encontra mais abaixo na página de manual:

-print

Verdade; imprima o nome completo do arquivo na saída padrão, seguido por uma nova linha. Se você estiver canalizando a saída do find para outro programa e houver a menor possibilidade de que os arquivos que você está procurando possam conter uma nova linha, considere seriamente usar a -print0opção em vez de -print. Consulte a seção UNUSUAL FILENAMES para obter informações sobre como os caracteres incomuns nos nomes de arquivos são tratados.

Stephen Kitt
fonte
Tipo de pergunta para iniciantes, mas de que expressão você está falando? é esta expressão regular?
precisa saber é o seguinte
2
@Rishi veja a página de manual .
Stephen Kitt
20

-printé a ação padrão . Alguns findpredicados são considerados ações em oposição a filtros ou condições . Por exemplo, -type fnão é uma ação. -execé uma ação, embora também possa ser usada como uma condição.

As ações incluem -print, -exece -ok. Algumas findimplementações ter outros predicados de ação não-padrão como o -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Onde nenhuma das ações<some-predicates> contidas é equivalente a:

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

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

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

A -printação padrão é especificada pelo POSIX. Algumas findimplementações antigas exigiam um explícito-print , mas elas geralmente não são encontradas na natureza atualmente.

Observe também que algumas findimplementações permitem omitir o files, nesse caso, elas padronizam a pesquisa no diretório atual. Ou seja, para eles,

find

é equivalente a

find .
find . -print

No entanto, isso não é padrão, por isso é melhor evitar.

No final mais detalhado (e útil) do espectro, algumas findimplementações também permitem a passagem de caminhos de arquivos como argumento para uma -fopção como em:

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

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

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

Stéphane Chazelas
fonte
Se não é padrão e é melhor evitar, por que nomeá-lo?
Isaac
@Isaac, porque pode ser útil / são possíveis erros de digitação ...
vonbrand
8

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

No POSIX, encontre a documentação :

Os seguintes comandos são equivalentes:

encontrar .

encontrar . -impressão

cuonglm
fonte
4

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

YoMismo
fonte
3
Isso seria versões muito muito antigas do AIX então. O AIX 4.3 findnão precisa dele. O AIX está em conformidade com o POSIX há décadas.
Stéphane Chazelas
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 hoje escrevo isso por hábito.

Mas, em algum momento, ele foi adicionado como a ação padrão find .e agora find . -printé equivalente.

Kevin
fonte
1

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

find . -print -delete

seria semelhante a

rm -rfv *

onde -printcorresponde -v. Se você não incluir -print, os nomes dos arquivos não serão exibidos.

A fim de tornar o rmcomando ainda mais semelhante, a propósito, emita este comando Bash primeiro

shopt -s dotglob

o que tornará os *arquivos de ponto (ocultos) correspondentes.

Pausado até novo aviso.
fonte