Pesquisar neste blog

quinta-feira, 11 de outubro de 2007

find

find [caminho] [expressão]

onde:

  • caminho fornece o nome do diretório por onde a pesquisa deve ser iniciada.
  • expressão é feita de opções (que afetam toda a operação e sempre retorna verdadeiro), testes (que retorna um valor falso ou verdadeiro), e ações (que tem efeitos colaterais e retornam um valor falso ou verdadeiro), todos separados por operadores. O valor -e é assumido onde um operador é omitido. Se a expressão não contém ações diferentes de -prune, -print é executado para todos os arquivos para os quais a expressão é válida.
Opções

-daystart : medem o tempo (para -amin, -atime, -cmin, -ctime, -mmin, e -mtime) do início do dia ou de até 24 horas atrás.

-depth : processa o conteúdo de cada diretório antes do diretório em si.

-follow : resolve as ligações simbólicas. Tem ligação com a opção -noleaf.

-help, --help : imprime um resumo do uso das linhas de comando de find e finaliza.

-maxdepth n : desce no máximo em n níveis (um inteiro não negativo) de diretórios sob os argumentos da linha de comando. A opção -maxdepth 0 significa a aplicação dos testes e ações somente nos argumentos da linha de comandos.

-mindepth n : não aplica qualquer teste ou ação a níveis menores que n níveis (um inteiro não negativo). A opção -mindepth 1 significa testar todos os arquivos exceto os argumentos da linha de comandos.

-mount : não descer em diretórios de outros sistemas de arquivos. É um nome alternativo para a opção -xdev.

-noleaf : não otimizar ao assumir que um diretório contém 2 entradas a menos que as ligações simbólicas para ele definidas. Esta otimização não é aplicável quando a pesquisa de sistemas de arquivos se dá em sistemas que não seguem uma convenção Unix. Cada diretório em um sistema de arquivos tem no mínimo 2 ligações diretas: seu nome e sua entrada `.'. Adicionalmente, seus subdiretórios (caso existam) tem cada um uma ligação de entrada `..' para aquele diretório. Quando find está examinando um diretório, após considerar 2 entradas a menos do que os contadores de ligações apontem, ele sabe que o restante das entradas no diretório não são outros diretórios (e sim arquivos folha na árvore de diretórios). Se somente os nomes de arquivos necessitam ser examinados, não há necessidade de examinar os diretórios; obtendo-se assim um incremento na velocidade de pesquisa.

-version, --version : lista o número da versão do comando find e finaliza.

-xdev : não desce diretórios em outros sistema de arquivos.

Testes

Argumentos numéricos podem ser:

  • +n : valores maiores que n.
  • -n : valores menores que n.
  • n : valor exatamente igual a n.

-amin n : arquivo foi acessado há n minutos.

-anewer arq : arquivo foi acessado mais recentemente do que arq tenha sido modificado. O teste -anewer é afetado pela opção -follow somente se -follow vir antes que -anewer na linha de comandos.

-atime num : procura por arquivos acessados há num dias.

-cmin n : o status do arquivo foi alterado em até n minutos atrás.

-cnewer arq : o status do arquivo foi alterado mais recentemente do que arq foi modificado. O teste -cnewer é afetado pela opção -follow somente se -follow vir antes que -cnewer na linha de comando.

-ctime n : o status do arquivo foi mudado nos últimos n dias.

-empty : o arquivo está vazio e é ou um arquivo regular ou um diretório.

-false : sempre falso.

-fstype tp : arquivo está em um sistema de arquivos do tipo tp. Pode-se usar a opção -printf com diretivas %F para ver os tipos dos sistemas de arquivos.

-gid n : o GID (Group Identification) do arquivo é n.

-group gname : arquivo pertence ao grupo gname (pode-se também usar aqui o GID do grupo).

-ilname pattern : semelhante ao teste -lname, mas neste caso o teste é sensível a maiúsculas e minúsculas.

-iname pattern : semelhante ao teste -name, mas neste caso o teste não é sensível a maiúsculas e minúsculas.

-inum n : procura por arquivo com inode n.

-ipath pattern : semelhante ao teste -path, mas neste caso o teste não é sensível a maiúsculas e minúsculas.

-iregex pattern : semelhante ao teste -regex, mas neste caso o teste não é sensível a maiúsculas e minúsculas.

-links n : arquivo tem n ligações.

-lname padrão : arquivo é uma ligação simbólica cujos conteúdos coincidem com o padrão de ambiente shell padrão. Os metacaracteres não tratam `/' ou `.' de forma especial.

-mmin n : os dados dos arquivos foram modificados há n minutos.

-mtime n : os dados foram modificados em até n dias atrás.

-name arquivo : procura pelo arquivo especificado. O nome do arquivo (o caminho à frente do nome do arquivo não é considerado) deve coincidir com os padrões informados. Os metacaracteres (`*', `?', e `[]') não combinam com um `.' no início no nome do arquivo. Para ignorar um diretório e os arquivos nele contidos, deve-se usar a ação -prune.

-newer arq : o arquivo foi modificado mais recentemente que arq. O teste -newer é afetado pela opção -follow somente se -follow vem antes de -newer na linha de comando.

-nouser : nenhum usuário corresponde ao ID numérico do usuário dono do arquivo.

-nogroup : nenhum grupo corresponde ao ID numérico do grupo dono do arquivo.

-path padrão : nome do arquivo combina com os padrões especificados em padrão. Os metacaracteres não tratam `/' ou `.' de forma especial. Use a ação -prune para ignorar o diretório especificado por padrão e todos os seus subdiretórios.

-perm valor : arquivos que possuem os bits de permissão exatamente iguais a valor (octal ou simbólico).

-perm -valor : arquivos que possuem todos os bits de permissão definidos em valor (octal ou simbólico).

-perm +valor : arquivos que possuem qualquer bit de permissão definido em valor (octal ou simbólico).

-regex padrão : arquivos que combinem com a expressão regular em padrão. Isto é uma combinação com todo o caminho, e não somente uma pesquisa.

-size n[bckw] : procura por arquivos que tem n unidades de espaço. Ao usar + (-) antes de n procura-se por um arquivo maior (menor) que n. As unidades são

  • b - blocos de 512 bytes (padrão);
  • c - bytes;
  • k - kilobytes;
  • w - palavras de 2 bytes.

-true : sempre verdadeiro.

-type tipo : procura arquivos de um determinado tipo. São tipos possíveis

  • b - blocos especiais (buffer)
  • c - caracteres especiais
  • d - diretórios
  • p - conector definido (FIFO)
  • f - arquivo regular
  • l - ligação simbólica
  • s - socket

-uid n : o UID do dono do arquivo é igual a n.

-used n : arquivo foi acessado n dias após a última alteração de seu status.

-user nome : arquivo pertence ao usuário especificado em nome (pode-se também usar aqui o UID do dono).

-xtype tp : semelhante a opção -type a menos que o arquivo seja uma ligação simbólica. Neste caso, se a opção -follow não foi informada, será verdadeiro se tp for igual a l. Ou seja, para ligações simbólicas -xtype checa o tipo de arquivo, ação que -type não executa.

Ações

-exec comando : executar comando; verdadeiro se o status de saída zero for retornado. Todos os argumentos para find serão considerados como argumentos do comando até que um argumento consistido por `;' seja encontrado. Os caracteres `{}' são substituídos pelo nome do arquivo que está sendo processado aonde que ele ocorra nos argumentos do comando, e não somente em argumentos onde esteja sozinho, como em algumas versões do find. Ambas as construções podem necessitar de um caractere de saída (como um `\') ou citados para protegê-los da expansão pelo ambiente de trabalho. O comando é executado no diretório inicial.

-fls arq : verdadeiro; semelhante a ação -ls mas grava o resultado em arq de forma similar a ação -fprint.

-fprint arq : verdadeiro; lista o nome completo em um arquivo arq. Caso arq não exista quando find está sendo executado, ele será criado; caso ele exista, será recriado sem conteúdo. Os arquivos de nome /dev/stdout e /dev/stderr são tratados de forma especial; eles são a referência à saída padrão e a saída de erros padrão, respectivamente.

-fprint0 arq : verdadeiro; similar a ação -print0 mas grava em arq como a ação -fprint.

-fprintf arq formato : verdadeiro; similar a ação -printf mas grava em arq como a ação -fprint.

-ok command : similar a -exec porém apresenta uma pergunta ao usuário na entrada padrão, e se a resposta não começar com `y' ou `Y', não executa o comando e retorna falso.

-print : verdadeiro; imprime o nome completo do arquivo na saída padrão, seguido de nova linha.

-print0 : verdadeiro; lista o nome completo do arquivo na saída padrão, seguido de um caractere nulo. Isso permite que um arquivo cujo nome contenha o caractere de nova linha seja corretamente interpretado pelos programas que processem a saída do comando find.

-printf formato : verdadeiro; lista formato na saída padrão, interpretando `\' como caractere de fuga e `%' como diretivas. Largura de campos e precisão podem ser especificadas de forma similar à função printf() da linguagem C. Diferentemente de -print, -printf não adiciona um caractere de nova linha ao final da cadeia de caracteres. Um caractere `\' seguido por outro é tratado como um caractere comum, sendo que ambos serão impressos. Um caractere `%' seguido por qualquer outro caractere será descartado (mas o outro caractere será impresso). O caractere de fuga e as diretivas são:

  • \a - campainha de alarme.
  • \b - retorno.
  • \c - pára a impressão deste formato imediatamente e descarrega a saída.
  • \f - alimentação de formulário.
  • \n - nova linha.
  • \r - avanço e retorno de linha.
  • \t - tabulação horizontal.
  • \v - tabulação vertical.
  • \\ - um literal de barra reversa (`\').
  • %% - um sinal de percentual.
  • %a - data e hora do último acesso ao arquivo no formato retornado pela função C ctime().
  • %Ak - data e hora do último acesso em um formato especificado em k, o qual é, ou `@' ou uma diretiva para a função strftime() da linguagem C. Os valores possíveis em k estão listados abaixo; alguns deles podem não estar disponíveis em todos os sistemas, devido às diferenças da função strftime entre eles.
    • @ - segundos desde 1 de Janeiro de 1970, 00:00 GMT.
    • campos de tempo:
      • H - hora (00..23)
      • I - hora (01..12)
      • k - hora ( 0..23)
      • l - hora ( 1..12)
      • M - minutos (00..59)
      • p - AM ou PM
      • r - hora, 12-horas (hh:mm:ss [AP]M)
      • S - segundos (00..61)
      • T - hora, 24-horas (hh:mm:ss)
      • X - representação local de horário (H:M:S)
      • Z - zona de horário (por exemplo, EDT), ou nada se nenhuma zona de horário for determinada.
    • Campos da data:
      • a - abreviatura local dos dias da semana (Dom..Sab)
      • A - nome completo do dia da semana, de tamanho variável (Domingo..Sábado)
      • b - nomes dos meses abreviados (Jan..Dez)
      • B - nomes dos meses completos com tamanho variável (Janeiro..Dezembro)
      • c - data e horário locais (Sáb Nov 04 12:02:33 EST 1998)
      • d - dia do mês (01..31)
      • D - data (mm/dd/aa)
      • h - igual a b
      • j - dia do ano (001..366)
      • m - mês (01..12)
      • U - número da semana no ano com domingo como o primeiro dia da semana (00..53)
      • w - dia da semana (0..6)
      • W - número da semana no ano com segunda-feira como o primeiro dia da semana (00..53)
      • x - representação local da data (mm/dd/yy)
      • y - últimos dois dígito do ano (00..99)
      • Y - ano (1970...)
    • %b - tamanho do arquivo em blocos de 512 bytes arredondado para cima.
    • %c - data da última mudança de status do arquivo no formato retornado pela função ctime() da linguagem C.
    • %Ck - data da última mudança de status do arquivos no formato especificado por k, o qual é o mesmo que para %A.
    • %d - profundidade dos arquivos na árvore de diretórios; zero significa que o arquivo é um argumento da linha de comando.
    • %f - nome do arquivo com exclusão de qualquer nome de diretório (somente o último elemento).
    • %F - tipo do sistema de arquivos em que o arquivo se encontra; este valor pode ser usado por -fstype.
    • %g - nome do grupo de arquivos, ou a identificação numérica do grupo caso este não tenha nome.
    • %G - identificação numérica do grupo do arquivo.
    • %h - caminho ou diretório(s) onde o arquivo está localizado (tudo exceto o último elemento).
    • %H - argumento da linha de comando na qual o arquivo foi encontrado.
    • %i - número do inode do arquivo (em decimais).
    • %k - tamanho do arquivo em blocos de 1K (arredondado para cima).
    • %l - objeto da ligação simbólica (vazio se o arquivo não for uma ligação simbólica).
    • %m - bits das permissões do arquivo (em octal).
    • %n - número de ligações diretas para o arquivo.
    • %p - nome do arquivo.
    • %P - nome do arquivo com o nome dos argumentos da linha de comando sob a qual ele foi removido.
    • %s - tamanho do arquivo em bytes.
    • %t - data da última modificação do arquivo no formato retornado pela função ctime() da linguagem C.
    • %Tk - data da última modificação do arquivo no formato especificado em k, o qual é o mesmo para %A.
    • %u - nome do dono do arquivo ou a sua identificação numérica se o dono não tiver nome.
    • %U - identificação numérica do dono do arquivo.
  • -prune : caso -depth não seja informado, será verdadeiro; não descendo a partir do diretório atual. Caso -depth seja informado, será falso e não terá efeito.
  • -ls : verdadeiro; lista o arquivo atual no formato ls -dils na saída padrão. O contador de blocos utiliza unidades de 1 Kb, a menos que a variável de ambiente POSIXLY_CORRECT esteja configurada, neste caso a unidade será de 512 bytes.
Operadores

Listados em ordem de precedência decrescente:

  • ( expr ) - força a precedência.
  • ! expr - verdadeiro se expr for falsa.
  • -not expr - o mesmo que ! expr.
  • expr1 expr2 - são implícitas; expr2 não será avaliada se expr1 for falsa.
  • expr1 -a expr2 - o mesmo que expr1 expr2.
  • expr1 -and expr2 - o mesmo que expr1 expr2.
  • expr1 -o expr2 - Ou; expr2 não é avaliada se expr1 for verdadeira.
  • expr1 -or expr2 - o mesmo que expr1 -o expr2.
  • expr1 , expr2 - lista; ambas expr1 e expr2 sempre são avaliadas. O valor de expr1 é descartado; o valor da lista é o valor de expr2.
Exemplos
  • O comando

    find -name teste.tex
    procura o arquivo teste.tex no diretório atual e em todos subdiretórios abaixo do diretório atual.
  • O comando

    find ~/ -maxdepth 3 -name teste.tex
    procura o arquivo teste.tex a partir do diretório home (~/) descendo no máximo 3 níveis de diretórios.
  • O comando

    find . -path './testes' -prune -o -print
    lista todos os arquivos encontrados a partir do diretório corrente exceto os arquivos que estão no diretório testes ou em algum dos seus subdiretórios.
  • O comando

    find . -size +1000k
    lista os arquivos com mais de 1000k de tamanho a partir do diretório atual (que está representado pelo '.').
  • Para localizar os arquivos SUID (possuem permissões de proprietário), digite

    find / -perm +4000
  • Use a opção atime para localizar programas novos ou acessados com mais freqüência. Por exemplo, o comando

    find /etc -atime -1
    lista os arquivos do diretório /etc que foram acessados há um dia ou menos, enquanto o comando
    find ~/ -atime +10
    lista os arquivos, a partir do diretório home do usuário, que foram acessados pela última vez há 10 dias ou mais.
  • O comando

    find / -type l -print |perl -nle '-e || print';
    procura por todos os links perdidos e os imprime.
  • O comando

    find . -user aluno1 -exec chown aluno2 {}
    altera o dono (veja comando chown) de todos os arquivos e subdiretórios a partir do diretório corrente de aluno1 para aluno2.
Observações

O uso do comando find, sem argumentos, faz com seja exibida a lista de todos os arquivos que ficam hierarquicamente abaixo do diretório corrente.