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

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.


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.


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


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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.