Como Usar Procurar e Localizar para Procurar Arquivos no Linux

author
9 minutes, 5 seconds Read

Introduction

Um problema que os usuários encontram quando lidam com uma máquina Linux é como encontrar os arquivos que estão procurando.

Este guia irá cobrir como usar o comando com o nome apropriado find. Isto irá ajudá-lo a procurar por arquivos em seu VPS usando uma variedade de filtros e parâmetros. Também vamos cobrir brevemente o comando locate, que pode ser usado para procurar por arquivos de uma maneira diferente.

Finding by Name

A maneira mais óbvia de procurar por arquivos é pelo nome.

Para encontrar um arquivo pelo nome, digite:

  • find -name "query"

Esta será sensível a maiúsculas e minúsculas, o que significa que uma busca por file é diferente de uma busca por File.

Para encontrar um ficheiro pelo nome, mas ignorar o caso da pesquisa, digite:

  • find -iname "query"

Se quiser encontrar todos os ficheiros que não aderem a um padrão específico, pode inverter a pesquisa com -not ou !. Se você usar !, você deve escapar do caractere para que a bash não tente interpretá-lo antes de encontrar:

  • find -not -name "query_to_avoid"

Or

  • find \! -name "query_to_avoid"

Finding by Type

Você pode especificar o tipo de arquivos que você quer encontrar com o parâmetro -type. Funciona assim:

  • find -type type_descriptor query

alguns dos descritores mais comuns que pode utilizar para especificar o tipo de ficheiro estão aqui:

  • f: ficheiro normal

  • d: directório

  • l: ligação simbólica

  • c: dispositivos de caracteres

  • b: dispositivos de bloco

Por exemplo, se quiséssemos encontrar todos os dispositivos de caracteres no nosso sistema, poderíamos emitir este comando:

  • find / -type c
Output
/dev/parport0/dev/snd/seq/dev/snd/timer/dev/autofs/dev/cpu/microcode/dev/vcsa7/dev/vcs7/dev/vcsa6/dev/vcs6/dev/vcsa5/dev/vcs5/dev/vcsa4. . .

Podemos procurar todos os ficheiros que terminam em .conf assim:

  • find / -type f -name "*.conf"
Output
/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf/usr/share/base-files/nsswitch.conf/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf/usr/share/rsyslog/50-default.conf/usr/share/adduser/adduser.conf/usr/share/davfs2/davfs2.conf/usr/share/debconf/debconf.conf/usr/share/doc/apt-utils/examples/apt-ftparchive.conf. . .

Filtragem por Tempo e Tamanho

Find dá-lhe uma variedade de formas de filtrar os resultados por tamanho e tempo.

Tamanho

Pode filtrar por tamanho com o uso do parâmetro -size

Adicionamos um sufixo no final do nosso valor que especifica como estamos a contar. Estas são algumas opções populares:

  • c: bytes

  • k: Kilobytes

  • M: Megabytes

  • G: Gigabytes

  • b: Blocos de 512 bytes

Para encontrar todos os arquivos que são exatamente 50 bytes, digite:

  • find / -size 50c

Para encontrar todos os arquivos com menos de 50 bytes, podemos usar este formulário:

  • find / -size -50c

Para encontrar todos os ficheiros com mais de 700 Megabytes, podemos usar este comando:

  • find / -size +700M

Time

Linux armazena dados de tempo sobre tempos de acesso, tempos de modificação, e tempos de mudança.

  • Tempo de acesso: Última vez que um arquivo foi lido ou escrito para.

  • Tempo de modificação: Última vez que o conteúdo do arquivo foi modificado.

  • Tempo de alteração: Última vez que os metadados do inode do arquivo foram alterados.

Podemos usá-los com os parâmetros -atime, -mtime, e -ctime. Estes podem usar os símbolos mais e menos para especificar mais ou menos do que, como fizemos com o tamanho.

O valor deste parâmetro especifica quantos dias atrás você gostaria de pesquisar.

Para encontrar arquivos que tenham um tempo de modificação de um dia atrás, digite:

  • find / -mtime 1

Se quisermos arquivos que foram acessados em menos de um dia atrás, podemos digitar:

  • find / -atime -1

Para obter arquivos que tiveram sua meta informação alterada pela última vez há mais de 3 dias, digite:

  • find / -ctime +3

Há também alguns parâmetros companheiros que podemos usar para especificar minutos em vez de dias:

  • find / -mmin -1

Isso dará aos arquivos que foram modificados digitar o sistema no último minuto.

Pode também fazer comparações com um ficheiro de referência e retornar aqueles que são mais recentes:

  • find / -newer myfile

Finding by Owner and Permissions

Pode também procurar por ficheiros pelo dono do ficheiro ou pelo dono do grupo.

Fá-lo usando os parâmetros -user e -group respectivamente. Encontre um ficheiro que seja propriedade do utilizador “syslog” digitando:

  • find / -user syslog

Simplesmente, podemos especificar ficheiros propriedade do grupo “shadow” digitando:

  • find / -group shadow

Podemos também procurar por ficheiros com permissões específicas.

Se quisermos corresponder um conjunto exacto de permissões, podemos usar este formulário:

  • find / -perm 644

Isto irá corresponder ficheiros com exactamente as permissões especificadas.

Se quisermos especificar qualquer coisa com pelo menos essas permissões, pode usar este formulário:

  • find / -perm -644

Isto irá corresponder a quaisquer ficheiros que tenham permissões adicionais. Um arquivo com permissões de “744” seria correspondido nesta instância.

Filtragem por profundidade

Para esta seção, criaremos uma estrutura de diretórios em um diretório temporário. Ela conterá três níveis de diretórios, com dez diretórios no primeiro nível. Cada diretório (incluindo o diretório temporário) conterá dez arquivos e dez subdiretórios.

Faça esta estrutura emitindo os seguintes comandos:

  • cd
  • mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
  • touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
  • cd ~/test

Feel free para verificar as estruturas dos diretórios com ls e cd para ter uma idéia de como as coisas estão organizadas. Quando terminar, volte ao diretório de teste:

  • cd ~/test

Trabalharemos em como retornar arquivos específicos desta estrutura. Vamos tentar primeiro um exemplo com apenas uma pesquisa regular de nomes, para comparação:

  • find -name file1
Output
./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1./level1dir7/level2dir8/level3dir6/file1./level1dir7/level2dir8/level3dir5/file1./level1dir7/level2dir8/file1. . .

Existem muitos resultados. Se canalizarmos a saída para um contador, podemos ver que existem 1111 resultados totais:

  • find -name file1 | wc -l
Output
1111

Provavelmente são demasiados resultados para serem úteis para si na maioria das circunstâncias. Tentemos restringir.

Pode especificar a profundidade máxima da pesquisa sob o directório de pesquisa de nível superior:

  • find -maxdepth num -name query

Para encontrar “ficheiro1” apenas nos directórios de “nível1” e acima, pode especificar uma profundidade máxima de 2 (1 para o directório de nível superior, e 1 para os directórios de nível1):

  • find -maxdepth 2 -name file1
Output
./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1

Esta é uma lista muito mais fácil de gerir.

Você também pode especificar um diretório mínimo se você souber que todos os arquivos existem além de um certo ponto sob o diretório atual:

  • find -mindepth num -name query

Nós podemos usar isto para encontrar somente os arquivos no final dos ramos do diretório:

  • find -mindepth 4 -name file
Output
./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1. . .

Again, por causa de nossa estrutura de diretórios de ramificação, isto irá retornar um grande número de resultados (1000).

Pode combinar os parâmetros de profundidade mínima e máxima para focar num intervalo estreito:

  • find -mindepth 2 -maxdepth 3 -name file
Output
./level1dir7/level2dir8/file1./level1dir7/level2dir5/file1./level1dir7/level2dir7/file1./level1dir7/level2dir2/file1./level1dir7/level2dir10/file1./level1dir7/level2dir6/file1./level1dir7/level2dir3/file1./level1dir7/level2dir4/file1./level1dir7/file1. . .

Executar e Combinar Comandos de Busca

Pode executar um comando helper arbitrário em tudo o que encontrar correspondências usando o parâmetro -exec. Isto é chamado assim:

  • find find_parameters -exec command_and_params {} \;

O parâmetro {} é usado como um espaço reservado para os ficheiros que encontrarem correspondências. O \; é usado para que o find saiba onde o comando termina.

Por exemplo, poderíamos encontrar os ficheiros na secção anterior que tinha 644 permissões e modificá-los para ter 664 permissões:

  • cd ~/test
  • find . -type f -perm 644 -exec chmod 664 {} \;

Poderíamos então alterar as permissões do directório desta forma:

  • find . -type d -perm 755 -exec chmod 700 {} \;

Se quiser encadear resultados diferentes em conjunto, pode usar os comandos -and ou -or. O -and é assumido se omitido.

  • find . -name file1 -or -name file9

Localizar arquivos usando Locate

Uma alternativa ao uso de find é o comando locate. Este comando é frequentemente mais rápido e pode procurar todo o sistema de ficheiros com facilidade.

Pode instalar o comando em Debian ou Ubuntu com apt:

  • sudo apt install mlocate

No CentOS, use dnf em vez disso:

  • sudo dnf install mlocate

A razão locate ser mais rápido que find é porque depende de uma base de dados dos ficheiros no sistema de ficheiros.

A base de dados é normalmente actualizada uma vez por dia com um script cron, mas pode actualizá-la manualmente digitando:

  • sudo updatedb

Executar este comando agora. Lembre-se, a base de dados deve estar sempre actualizada se quiser encontrar ficheiros recentemente adquiridos ou criados.

Para encontrar ficheiros com localização, basta usar esta sintaxe:

  • locate query

Pode filtrar a saída de algumas formas.

Por exemplo, para apenas retornar arquivos contendo a consulta em si, ao invés de retornar todos os arquivos que possuem a consulta nos diretórios que levam a ela, você pode usar a opção -b para apenas procurar o “basename”:

  • locate -b query

Para ter localizado apenas os resultados que ainda existem no sistema de arquivos (que não foram removidos entre a última updatedb chamada e a atual locate chamada), use a marcação -e:

  • locate -e query

Para ver estatísticas sobre as informações que a localização catalogou, use a opção -S opção:

  • locate -S
Output
Database /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database

Conclusão

Both find and locate are good ways to find files on your system. Cabe a você decidir qual dessas ferramentas é apropriada em cada situação.

Find and locate são comandos poderosos que podem ser reforçados combinando-os com outros utilitários através de pipelines. Experimente filtrar usando comandos como wc, sort, e grep.

.

Similar Posts

Deixe uma resposta

O seu endereço de email não será publicado.