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
Output1111
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
OutputDatabase /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
.
.