10 exemplos de uso do comando find no Linux

O find é um utilitário incrivelmente flexível e muito usado na linha de comando do Linux/UNIX ou dentro de scripts.
Com ele é possível encontrar arquivos por tipo, por condição, por conteúdo etc. dentro do seu sistema e através de buscas recursivas.

O comando find já foi abordado em outros artigos, neste site.
Se você tiver interesse em complementar seu conhecimento sobre o tema, clique nos links no decorrer do texto ou use o sistema de busca do site.

Nestes exemplos, vou mostrar que você pode usar diversos critérios de busca com o comando find: permissões, pertencimento (ownership), por data/hora de alteração, por tamanho etc.

Por ser um comando padrão, no UNIX e no GNU/Linux, não há necessidade de instalar nada. Apenas abra um terminal (Ctrl + Alt + T, no Ubuntu) e comece a aplicar os exemplos.

O comando find é uma ferramenta essencial para o aprendizado de quem deseja se tornar produtivo na linha de comando do Linux ou do MacOS.

Exemplos de uso do find

O uso básico do find não precisa incluir qualquer opção ou parâmetro.
Ao executar o find no diretório (pasta) atual, ele irá perscrutar todos os subdiretórios, recursivamente, e exibir a lista completa de arquivos, inclusive aqueles que estão ocultos.


find

A depender do diretório atual, a execução pode ser um pouco demorada. Mas pode ser interrompida a qualquer momento com as teclas Ctrl + C.
Geralmente, é possível combinar o find ao comando grep, para refinar os resultados da busca:


find | grep -i "comando find"

./Documentos/Livros/Imagens/elias.praciano.com - featured/comando find.jpg
./.fotoxx/thumbnails/hem/justincase/Documentos/Livros/Imagens/elias.praciano.com - featured/comando find.jpg.jpeg

O comando acima é equivalente ao ls, conforme o exemplo abaixo:


ls -lahR | grep -i "comando find"

… o find costuma ser bem mais rápido, contudo. Faça as suas experiências.

O comando pode ser executado especificamente em um diretório:


find Imagens/2018/

Também é possível filtrar por nome ou extensão do arquivo que você deseja encontrar:


find Imagens/2018/*.ods

Imagens/2018/foapiso.ods
Imagens/2018/imagens2018_18-55mm.ods
Imagens/2018/imagens2018_75-300mm.ods
Imagens/2018/imagens2018_sigma30mm.ods
Imagens/2018/stat-imagens2018.ods

Com o parâmetro ‘-name’, é possível obter resultados mais precisos em sua busca.


find Imagens/2018/ -name "panoramas"

Imagens/2018/06/16/panoramas

O resultado da busca é sensível à caixa (maiúsculas/minúsculas) das letras.
Para desligar a sensibilidade (case sensitiveness), use ‘-iname’:


find Imagens/2018/ -iname "panoramas"

Use também os coringas entre as aspas:


find Imagens/2018/ -iname "*noram*"

Imagens/2018/05/01 ana maria/panorama_2242_2247.tif
Imagens/2018/05/01/darktable_exported/panorama_2242_2247.jpg
Imagens/2018/06/16/panoramas

Ao optar por fazer a busca no diretório raíz / todo o sistema será vasculhado, incluindo a rede e os dispositivos externos conectados (se estiverem montados).

A recursividade é padrão para o comando find. Se você quiser restringir a profundidade da busca, precisa definir isso claramente.
Com a opção ‘-maxdepth’ é possível determinar até quantos subdiretórios devem ser analisados.


find Imagens/ -maxdepth 3 -iname "*.cr2"

Imagens/Capture/capture000000.cr2
Imagens/Capture/capture000001.cr2
Imagens/Capture/capture000002.cr2
Imagens/Capture/capture000003.cr2
Imagens/Capture/capture000004.cr2
Imagens/Capture/capture000005.cr2
Imagens/Darktable/20180525_noname/20180525_0001.CR2
Imagens/Darktable/20180525_noname/20180525_0002.CR2
Imagens/Darktable/20180525_noname/20180525_0003.CR2

Para fazer a busca apenas no diretório atual, sem recursividade, use ‘-maxdepth 1’.

Também é possível inverter o filtro da busca.
Por exemplo, eu sei que dentro de Imagens/ há vários subdiretórios com arquivos .jpg e .cr2 (arquivos RAW da Canon). Mas também há outros tipos de arquivos.
Veja como excluir dos resultados da busca os arquivos .cr2:


find Imagens/ -not -iname "*.cr2"

Para facilitar, use ‘!’ no lugar de ‘-not’:


find Imagens/ ! -iname "*.png"

Use o operador ‘-o’ (OR) para restringir a busca a 2 ocorrências:


find Imagens/ -iname "*.txt" -o -iname "*.ods"Imagens/2018/aberturas.txt

Imagens/2018/distfocal.txt
Imagens/2018/distfocal_75-300.txt
Imagens/2018/maio2018.txt
Imagens/2018/stat-imagens2018.ods
Imagens/2018/imagens2018_18-55mm.txt
Imagens/2018/imagens2018_18-55mm.ods
Imagens/2018/imagens2018_75-300mm.txt
Imagens/2018/imagens2018_sigma30mm.txt
Imagens/2018/imagens2018_75-300mm.ods
Imagens/2018/imagens2018_sigma30mm.ods
Imagens/2018/imagens2018_sigma30mm-b.txt
Imagens/2018/imagens2018_Yongnuo35-50mm.txt
Imagens/2018/foapiso.txt
Imagens/2018/foapiso.ods

O operador AND pode ser invocado com a opção ‘-a’, embora seja um comportamento padrão:


find Imagens/2018 -iname "*.cr2" -a -iname "*.jpg" 

Combine com o operador ‘!’, para excluir exatamente aqueles 2 tipos de arquivos:


find Imagens/2018 ! -iname "*.cr2" -a ! -iname "*.jpg" 

Notou que os nomes de diretórios também são mostrados?
Pois é… Para o UNIX/Linux “tudo é arquivo”.

Se quiser filtrar mais ainda os resultados, para mostrar apenas arquivos “de verdade”, use a opção ‘-type f’:


find Imagens/2018 -type f ! -iname "*.cr2" -a ! -iname "*.jpg"

Use o comando wc, para contar quantos arquivos (no meu exemplo) não são .cr2 ou .jpg, na busca:


find Imagens/2018 -type f ! -iname "*.cr2" -a ! -iname "*.jpg" | wc -l

445

No exemplo simplificado, abaixo, veja como encontrar todos os estilos do DarkTable armazenados em uma pasta:


find Imagens/2018 -type f -iname "*.dtstyle" | wc -l

255

A sua pesquisa pode incluir mais de um diretório:


find Imagens/2018/06/ Imagens/2018/04/ -type f -iname "*.xmp"

Imagens/2018/06/02/img_4337.cr2.xmp
Imagens/2018/06/12/img_4667.cr2.xmp
Imagens/2018/06/15/img_4891.cr2.xmp
Imagens/2018/06/16/img_4996.cr2.xmp
Imagens/2018/06/16/panorama/img_5064.cr2.xmp
Imagens/2018/04/25/img_1536.cr2.xmp
Imagens/2018/04/28/break/img_1962.cr2.xmp

Espero que, com estes exemplos, tenha ajudado você a entender e usar melhor o comando find no seu sistema. 😉
Divirta-se!

Use o exiftool para descobrir como você fotografa

O exiftool é uma ferramenta CLI voltada para a obtenção de informações EXIF ou meta tags de arquivos diversos.
Se você usa MacOS ou Windows, baixe sua cópia do programa no site oficial (link ao final do artigo).

Se você usa Linux (que nem eu!), ele provavelmente já estará instalado aí, com suporte a aproximadamente 200 tipos de arquivos.

Neste universo de possibilidades, a ferramenta suporta a leitura de dados contidos em arquivos de imagens JPEG, bem como, em arquivos RAW de vários fabricantes.

O próprio Flickr usa o exiftools para manipular e analisar as informações das imagens de suas comunidades.

Neste post, vou mostrar como usar o programa para obter informações, de dentro dos arquivos. Vou, ainda, mostrar como associar o utilitário aos comandos grep e find, para refinar a sua busca e obter apenas resultados relevantes para o seu contexto.

Se você já tem dezenas de milhares de fotos e já usou várias lentes para produzir suas imagens, com estas ferramentas é possível montar algumas estatísticas sobre os seus hábitos ao fotografar.

Este tipo de informação pode ser muito útil para quem pensa em comprar uma nova lente, mas se encontra em dúvida sobre se o investimento irá ser realmente útil ou não.

Em outras palavras, faz sentido conhecer a distância focal que você prefere usar — mesmo nas lentes de zoom — antes de começar a analisar as opções disponíveis nas lojas.

Por exemplo, se você já se encontra há um ano usando uma das lentes que costuma vir com os kits de câmera e está pensando em qual poderia ser a próxima aquisição, seria muito interessante saber como você prefere trabalhar antes de tirar a carteira do bolso.

As lentes do kit costumam ser lentes de zoom, com distâncias focais variando entre 18-55mm, 55-250mm ou 75-300mmm (pelo menos, no caso da Canon).
Dentro da distância focal da lente do seu kit, você deve estar usando uma ou outra com predominância.

Isto quer dizer que, se você costuma fotografar frequentemente a aproximadamente 40mm, esta poderia ser a lente prime a ser sondada, na próxima compra.

As ferramentas descritas neste texto já foram abordadas com maior profundidade em outros posts, caso você queira saber um pouco mais sobre cada uma delas:

  1. O comando grep
  2. O comando find
  3. O comando exiftool

Execute o exiftool diretamente no arquivo

A ferramenta pode ser simplesmente aplicada a um ou vários arquivos de um diretório:


exiftool minhasfotos/img_2365.cr2

Para analisar todas os arquivos do diretório (ou da pasta), use-a assim:


exiftool minhasfotos/*.cr2

Altere os meus exemplos à sua realidade, aí.
Este segundo comando pode ser modificado para mostrar resultados mais específicos.
Veja como obter os valores das aberturas (aperture) usadas nas fotografias desta mesma pasta:


exiftool minhasfotos/*.cr2 | grep "Aperture" 

Note que os arquivos .cr2 correspondem aos “arquivos crus” das câmeras Canon. Se você tem arquivos com extensões diferentes, adeque o comando ao seu caso.
A tag (ou etiqueta) “Aperture” também pode variar em função das preferências do fabricante.
Se você fotografa sempre em JPEG, estas informações também estarão lá.
Fique atento.
Decida qual a meta tag mais importante para você e faça a sua busca.

O comando find pode ser usado para serviço mais pesado. No exemplo que segue, todas as pastas serão vasculhadas, recursivamente, a partir do diretório atual.

Neste caso, o resultado pode demorar bastante — vai depender da quantidade de imagens que você tem aí.
No meu caso, são milhares de imagens, dentro do diretório ‘Imagens’, espalhadas em vários subdiretórios. Decidi por todas as referências a abertura (Aperture) em um arquivo aberturas.txt — para verificar posteriormente, em separado. Ficou assim:


find ./ -name '*.cr2' -exec /usr/bin/exiftool {} \; | grep "Aperture" > aberturas.txt

O arquivo ficou com aproximadamente 8 mil linhas, embora sejam apenas 1564 arquivos de imagens RAW — mas a palavra “aperture” aparece, em média, mais de 4 vezes no resultado do exiftool de cada um.

Para saber quantas vezes usei a abertura 1.8, posso recorrer novamente ao grep:


cat aberturas.txt | grep "Aperture                        : 1.8"| wc -l

456

Este resultado mostra que o valor é usado em quase 1/3 das fotos.

Como descobrir a distância focal favorita nas suas fotos

Este é um dado bastante interessante, para quem pretende comprar uma lente nova — principalmente se for uma fixa (ou prime).
Saber qual a distância focal (ou focal length) que você mais usa nas suas sessões, pode ajudar determinar qual lente seria mais útil para você.
Para encontrar o meu resultado, novamente usei aqueles 3 comandos:


find ./ -name '*.cr2' -exec /usr/bin/exiftool {} \; | grep "Focal Length                    :" > distfocal.txt

No meu caso, o campo “Focal Length” se repete para cada foto em uma linha em que é dada uma distância focal equivalente. Para excluir esta redundãncia, acrescentei um “grep -v” ao final da linha de comando:


find ./ -name '*.cr2' -exec /usr/bin/exiftool {} \; | grep "Focal Length                    :" | grep -v "equivalent" > distfocal.txt

Desta forma, consigo obter um arquivo distfocal.txt com exatamente 1564 linhas — número igual ao de arquivos de imagens RAW .cr2.

Uso muito a lente do kit 75-300mm, e creio que seria interessante saber, exatamente, qual a distância focal mais usada dentro destes limites.
Esta informação pode ajudar a determinar qual lente prime seria mais útil para o meu caso: 85mm, 100mm, 135mm etc.

Conclusão

Por um lado, acredito que 1564 fotos pode ser um número muito pequeno para ser analisado, com o objetivo de determinar qual a sua distância focal favorita.
Isto varia de pessoa para pessoa.
Neste momento, acho os meus dados insuficientes para determinar “a minha maneira favorita” de fotografar.

Levar os dados obtidos para dentro de uma planilha é uma alternativa mais eficiente para obter informações sobre a maneira como você usa seu equipamento.

Eu prefiro sair para uma sessão de fotos, com apenas uma lente de zoom e brincar bastante.
Ao voltar, transfiro minhas imagens para o computador. Em seguida, rodo o exiftool, combinado com o grep, na pasta das fotos e observo as minhas estatísticas.

Me conte se você já descobriu qual a sua maneira favorita de fotografar e qual a sua lente ou distância focal preferida 😉

Link para o site oficial de downloads e documentação: https://sno.phy.queensu.ca/~phil/exiftool/.

Leia também meus outros artigos sobre o exiftool.

Use o exiftool para extrair detalhes sobre seus arquivos multimídia

O exiftool é uma ferramenta CLI, que pode ser usada para obter informações de diferentes tipos de arquivos de áudio, imagem e vídeo.
Pode também ser usado para alterar ou acrescentar novos dados meta em seus arquivos.

Neste post, vou mostrar como a ferramenta pode ser usada para extrair algumas informações.
Usarei como exemplo alguns arquivos de imagem RAW, mas os princípios são os mesmos para outros tipos de arquivos, tais como JPEG, MP3, FLAC, AVI, MPEG etc.

Consulte o manual (man exiftool) para obter uma lista de tipos de arquivos suportados — são aproximadamente 200.

Relação de tipos de arquivos suportados pelo exiftool
Clique para ver detalhes.

Quem tem vários arquivos de áudio (MP3, OGG, FLAC etc) pode editar nomes de autores, de álbum etc dentro dos arquivos. Estas informações (meta tags ou etiquetas meta), em geral, são lidas e exibidas no visor do seu MP3 Player.
Nas câmeras, estas informações são armazenadas nos arquivos “crus” ou nos JPEGS — e costumam dar informações importantes como data, local, distância focal da lente etc. relacionadas às suas fotos.

Canon JPEG meta tags
Clique para ver detalhes.

O acesso a estas informações ajuda o seu sistema a organizar arquivos de mídia a partir das informações contidas neles.

Como obter informações de arquivos de mídia a partir do exiftool

No gerenciador de arquivos Nautilus, estas informações podem ser obtidas sem o uso do exiftool. Para isso, selecione o arquivo e tecle Ctrl + Enter sobre ele. As meta tags costumam ser listadas na última aba do painel de informações do arquivo.

Na CLI (linha de comando), o programa oferece uma interface e um uso bem simplificado. Basta executá-lo, seguido do nome de um arquivo:


exiftool img_4380.cr2

No exemplo, acima, rodei o exiftool em um arquivo de imagem RAW da Canon.

O comando grep pode ajudar a refinar o resultado, listando apenas as informações que se deseja obter. No exemplo, a seguir, o comando é usado para extrair a informação sobre a duração de uma música, de um arquivo MP3.


exiftool ~/Música/Chico\ Buarque/Caravanas/04\ -\ Jogo\ de\ Bola.mp3 | grep -i duration

Duration                        : 0:02:51 (approx)

Para obter informações de arquivos de vídeo ou imagem siga a mesma lógica.
Abaixo, veja como obter informações sobre a lente usada para tirar uma foto:


exiftool ./06/05/img_4380.cr2 | grep -i lens

Lens Type                       : Canon EF 17-35mm f/2.8L USM or Sigma Lens
Lens Info                       : 30mm f/?
Lens Model                      : 30mm
Lens Serial Number              : 0000000000
Lens                            : 30.0 mm
Lens ID                         : Sigma 30mm f/1.4 EX DC HSM
Lens                            : 30.0 mm (35 mm equivalent: 47.2 mm)

A ferramenta pode ser usada também para levantar dados de arquivos remotos, em sites da Internet. Para isto, você usa o piping acompanhando o comando do curl, assim:


curl -s https://assets.ubuntu.com/v1/8dd99b80-ubuntu-logo14.png | exiftool -fast -

ExifTool Version Number         : 11.00
File Type                       : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 540
Image Height                    : 243
Bit Depth                       : 8
Color Type                      : RGB with Alpha
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
SRGB Rendering                  : Perceptual
Background Color                : 255 255 255
Pixels Per Unit X               : 2834
Pixels Per Unit Y               : 2834
Pixel Units                     : meters
Modify Date                     : 2011:06:28 17:04:37
Image Size                      : 540x243
Megapixels                      : 0.131

Como fazer buscas via grep dentro de arquivos texto .doc

Arquivos .doc, do Microsoft Office são arquivos binários, com muito pouco conteúdo em texto e, portanto, imunes à leitura pelo comando grep.
Mas você pode contornar facilmente o problema com o uso de uma ferramenta adicional, o catdoc.

Geralmente, o utilitário não costuma vir instalado, por padrão.
Mas ele está disponível nos repositórios oficiais da maioria das distribuições GNU/Linux. É só ir lá e pegar…

No Debian ou no Ubuntu, faça a instalação via apt:


sudo apt install catdoc

O catdoc tem limitações.
A partir do programa, é possível realizar um cat “normal” em cima de qualquer arquivo .doc comum.
Já o conteúdo de arquivos criptografados ou do tipo .docx infelizmente não pode ser visto ou pesquisado pelo aplicativo.
catdoc grep

O utilitário, combinado com o comando grep, dará o resultado desejado.
Segue um exemplo:


catdoc Documentos/Guia\ do\ ubuntu.doc | grep -i ubuntu

Leia mais sobre o comando grep.

Como pesquisar em arquivos .ODT, com o comando grep

Infelizmente, o comando grep não consegue enxergar o conteúdo de arquivos .odt, bem como muitos outros arquivos que não sejam puro texto.
Arquivos binários, como é o caso, não são transparentes para o uso do grep.

Neste texto, vou mostrar como fazer a conversão do seu arquivo .odt e, durante o processo, o grep captura o conteúdo e faz a busca pelas strings que você sugere, na linha de comando.
Para isto, o utilitário odt2txt faz a conversão do .odt e repassa o resultado ao comando grep.
A sintaxe é assim:

odt2txt --stdout nome-do-arquivo.odt | grep -i string-a-ser-pesquisada

Veja um exemplo:


odt2txt --stdout Documentos/Linux\ Cloud.odt | grep -i linux

A Evolução do GNU/Linux
Distribuições GNU/Linux
Certificação Linux
Mercado Linux
Conhecendo a Arquitetura do Sistema Linux
Linux Inside: Instalação Desktop Debian e CentOS

Com a opção ‘–stdout’, o utilitário odt2txt desvia o resultado para a saída padrão do sistema.
Em seguida, o grep é chamado para interceptar o resultado, no modo texto e exibir as linhas que contém a cadeia de caracteres solicitada.

Leia mais sobre o comando grep.