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!

Experimente o Debian com o kernel do FreeBSD.

O Debian é uma comunidade aberta a diversos projetos interessantes.
Há, pelo menos, 2 projetos que oferecem o sistema operacional combinado a um kernel alternativo.
Já falei sobre o Debian rodando com o kernel GNU/Hurd, antes.
Desta vez, vou mostrar como baixar uma versão que roda sobre o kernel do FreeBSD.
A melhor maneira de testá-la é rodar uma das imagens prontas para o QEMU/KVM.

O sistema não é pesado e dá para você se divertir e ter uma idéia do seu funcionamento.

Neste post, vou analisar uma destas 3 opções:

  1. debian_squeeze_kfreebsd-amd64_standard.qcow2
    — uma opção mais antiga, sem o ambiente gráfico (imagem c/204 Mb).
  2. debian_wheezy_kfreebsd-amd64_desktop.qcow2
    — uma opção mais atual (Debian 7), com o ambiente gráfico (imagem c/1,7 Gb).
  3. debian_wheezy_kfreebsd-amd64_standard.qcow2
    — Debian 7, sem o ambiente gráfico (imagem c/210 Mb).

As imagens estão comprimidas e se expandem até 25 GiB, na medida do necessário.
Os exemplos, que seguem, são baseados na 3a opção.
Se preferir outra, basta adaptá-los ao seu caso.
Use o comando wget para fazer o download ou baixe direto do site (links no final):


wget https://people.debian.org/~aurel32/qemu/kfreebsd-amd64/debian_wheezy_kfreebsd-amd64_standard.qcow2

Feito o download, rode o sistema a partir do QEMU:


qemu-system-x86_64 -hda debian_wheezy_kfreebsd-amd64_desktop.qcow2

Bem simples, não é?
Para poder usar melhor o sistema, use as seguintes informações:

  • A conta root usa a senha “root” (sem as aspas).
  • A conta user usa a senha “user”.

Para obter um melhor desempenho, ative o KVM:


qemu-system-x86_64 -enable-kvm -hda debian_wheezy_kfreebsd-amd64_desktop.qcow2

Para suprimir o modo gráfico, coloque o display no modo curses:


qemu-system-x86_64 -enable-kvm -display curses -hda debian_wheezy_kfreebsd-amd64_desktop.qcow2

Neste caso, pode ser necessário aumentar um pouco (ou maximizar) a janela do seu terminal, para conseguir ver toda a área de trabalho.
Como padrão, a imagem roda com 128 MiB de memória RAM.
Use a opção ‘-m’ do QEMU para ampliar este valor:


qemu-system-x86_64 -m 512 -enable-kvm -display curses -hda debian_wheezy_kfreebsd-amd64_desktop.qcow2


Se você optou por uma das imagens com ambiente gráfico, acima, vai precisar usar uma quantidade maior de memória RAM, claro.
Neste caso, as imagens usam lightDM com o XFCE e 1GiB de memória RAM deve ser mais do que o suficiente.
Se quiser trocar este ambiente, pelo original do Debian (GDM e GNOME), dê os seguintes comandos, dentro da máquina virtual (como superusuário):


update-alternatives --auto x-session-manager

echo /usr/sbin/gdm3 > /etc/X11/default-display-manager

Vale a pena instalar e usar o Debian com o kernel FreeBSD?

Diferente do Hurd, o kernel do FreeBSD é um kernel maduro e bem testado.
Aqui é possível usar todo o ambiente gráfico e usufruir do universo dos repositórios de softwares do Debian.
No lado do servidor, a opção é uma alternativa para quem deseja ficar longe do systemd e/ou evitar as eventuais vulnerabilidades do kernel Linux.
Há, ainda, o glamour de estar mais próximo de executar um kernel semelhante ao usado pela Apple em seus dispositivos.
Do ponto de vista de quem vem do FreeBSD, esta opção “mantém um pé” lá e outro nos vastos repositórios de softwares Debian.

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Referências

De onde baixei a versão analisada neste texto: https://people.debian.org/~aurel32/qemu/kfreebsd-amd64/.
Outras versões do Debian kfreebsd: http://jenkins.kfreebsd.eu/jenkins/view/cd/job/debian-cd_jessie-kfreebsd_kfreebsd-amd64/ws/build/.
Debian Mini .ISO (para instalar): http://cdn-fastly.deb.debian.org/debian/dists/jessie-kfreebsd-proposed-updates/main/installer-kfreebsd-amd64/current/images/netboot-10/.
Conheça o Debian GNU/Hurd: https://elias.praciano.com/2017/07/experimente-o-debian-com-o-kernel-gnuhurd-em-uma-maquina-virtual/.

Como encontrar e instalar pacotes de softwares para FreeBSD com o pkg

A lista de aplicações disponíveis para FreeBSD cresce a cada dia.
Tal como em outros sistemas operacionais Unix-like, há várias maneiras de encontrar e instalar os pacotes de softwares que você precisa.
O FreeBSD, a exemplo de várias distribuições GNU/Linux, também seus sistemas de gestão de pacotes.

Como buscar os softwares disponíveis no repositório do FreeBSD

Se quiser fazer a busca por pacotes de softwares binários, dentro do repositório oficial, use o utilitário pkg.
Veja um exemplo:

pkg search tetris

Segue a relação de pacotes que contenham, em sua descrição, a string ‘tetris’:

patapizza-tetris-1.0_6         Unofficial clone of the original Tetris game
vitetris-0.57                  Terminal-based Tetris clone in vein of Nintendo Tetris

Na primeira coluna, vem o nome e a versão do pacote. Na segunda coluna, uma breve descrição.
Para obter a informação sobre a categoria a que cada pacote pertence, use a opção -o:

pkg search -o tetris 

Neste caso, todos os pacotes pertencem a categoria (origem) ‘jogos’ e a versão de cada um não será exibida na primeira coluna:

games/patapizza-tetris         Unofficial clone of the original Tetris game
games/vitetris                 Terminal-based Tetris clone in vein of Nintendo Tetris

Ao usar o ‘search’ simples, o gestor de pacotes pode oferecer informações sobre a versão da linguagem de programação (Python, PHP, Ruby, C etc.) sobre a qual aquele pacote foi construído.
No exemplo, abaixo:

pkg search subversion 
git-subversion-2.9.2           Distributed source code management tool with FreeBSD subversion bindings
java-subversion-1.9.4          Java bindings for Version control system
p5-subversion-1.9.4            Perl bindings for Version control system
py27-hgsubversion-1.8.6        Mercurial extension that allows using it as a Subversion client
py27-subversion-1.9.4          Python bindings for version control system
ruby-subversion-1.9.4          Ruby bindings for version control system

Recomendo usar o comando grep para filtrar resultados muito extensos e obter apenas o que necessita:

pkg search mp3 | grep player 
ksmp3play-0.5.2.1_4            Curses-based MP3 player
mp3blaster-3.2.5_5             MP3 console ncurses-based player
ximp3-0.1.15                   Simple console MP3 player

Alternativas ao systemd

O systemd é mais um sistema init disponível para sistemas operacionais GNU/LINUX.
Diferente de outros, este é exclusivo de sistemas operacionais Unix-like que usam o kernel Linux.
Se você clicar na tag systemd, vai encontrar vários posts, neste site, sobre o assunto — inclusive um que fala muito mal dele (que coisa feia, Elias…) 😉
ssytemd emot carrousel
Neste texto, vamos abordar o conceito do init system, quais são as opções deste tipo de software e, por fim, conhecer algumas distribuições Linux que usam alternativas ao systemd — não vai dar pra falar de todas, por que são mais de 70.

O que é um init system

Em sistemas operacionais Unix-like, o init é o primeiro processo iniciado, durante a inicialização do sistema.
Init é abreviatura da palavra initialization.
É o ancestral direto ou indireto de todos os processos rodando no seu sistema, neste momento.
Ele adota todos os processos órfãos automaticamente.
O init é iniciado pelo kernel usando nome de arquivo hard-coded.
A principal causa do kernel panic é quando o init não pode ser carregado. Ele é tipicamente identificado como o PID 1.
O systemd é mais do que apenas um sistema init. Enquanto uns avaliam este fato como uma evolução do conceito, outras apontam nele um de seus maiores defeitos.

Alternativas ao systemd

Várias alternativas ao systemd estão disponíveis para uso da comunidade.
Segue uma relação (atual e relevante) de init systems, para Linux:

  • Bootscripts — comumente usado no GoboLinux
  • Initng — é um substituto atual para o UNIX System V init e para o Sysvinit (usado no Linux), escrito em C e lançado em 2005.
    Nas implementações tradicionais do init, processos são iniciados em ordem pre-determinada. Além disto, um processo só será iniciado, depois que o anterior estiver finalizado.
    O Initng inicia processos assim que suas dependências forem satisfeitas. Foi projetado para iniciar vários processos em paralelo e melhorar a velocidade de boot dos sistemas.
  • runit — Esquema init com supervisão de serviços. Concebido como substituto do SysVinit e outros projetos.
  • minit — Um init mínimo com supervisão de processos, ordenação de dependências de serviços, ativação de serviços paralelos etc.

Você vai encontrar mais itens na página do Wikipedia — fique atento para o fato de que alguns projetos estão mortos.

Distribuições Linux que usam outros init systems

Como disse, no começo, são muitas dezenas de opções. E ter opções, no mundo do software livre é importante.
Não vai dar para citar todas, contudo sugiro visitar o site without-systemd para ver uma relação mais completa.
O Distrowatch também tem uma relação de distribuições Linux que não usam o systemd.
Na lista, abaixo, separei uma relação de distribuições livres do systemd, que se destacam por diversos motivos:

  1. FreeBSD, OpenBSD etc — Os BSD não são Linux e não existe compatibilidade entre o systemd e estas distros — embora seja possível usá-los com o kernel Linux.
    O site tem vários posts sobre BSD, caso você se interesse.
  2. Slackware — no momento, a distro não aderiu ao systemd, mas não existe nenhum comprometimento do Patrick Volkerding no sentido de se manter distante deste sistema. Para quem gosta do Slackware, vale experimentar o Porteus — http://www.porteus.org/.
    Este projeto tem o comprometimento de seguir sem o systemd.
  3. Devuan — este é o projeto Debian, tocado por ex-integrantes que não concordaram com a mudança para o systemd. Veja mais no site http://devuan.org. Experimente também o Finnix, o Overclockix, o Trios, o Debian GNU/Hurd e o Debian KFreeBSD. Estes 2 últimos são opções para puristas e vale a pena conhecer.
  4. Tails — este é um projeto derivado do Debian e voltado para oferecer mais criptografia e segurança, com mais conforto para o usuário.
    Temos alguns textos, no site, mencionando este projeto.
  5. UbuntuBSD — como o nome indica, é baseado no Ubuntu e usa o núcleo do FreeBSD. Em vez do Unity, usa o ambiente gráfico XFCE. Também é uma opção interessante. Dá uma olhada no site oficial da distro: https://www.ubuntubsd.org/.
  6. Alpine Linux — Distro independente, de propósito genérico e projetada para power users.
    usea OpenRC como init systemhttp://www.alpinelinux.org/.
  7. Gentoo — Uma das distribuições mais conhecidas, que não se rendeu ao systemd — https://www.gentoo.org/.
  8. ReactOS — Tal como o Gentoo, trata-se de uma distro Linux, já estabelecida e com uma comunidade formada ao seu redor — https://www.reactos.org/.

Conhece alguma outra distro livre do systemd, que você gostaria de recomendar? Escreva nos comentários!

Referências

https://en.wikipedia.org/wiki/Init.
https://distrowatch.com/search.php?pkg=systemd&distrorange=NotInLatest#pkgsearch.
http://without-systemd.org/wiki/index.php/Main_Page#GNU.2FLinux_distributions.

Aprenda a usar o comando getfacl do Linux

O comando getfacl é um dos comandos padrão do Linux e serve para obter uma lista do controle de acesso de qualquer arquivo no seu sistema.

O utilitário está presente também no FreeBSD e, para cada arquivo, o getfacl exibe uma quantidade de informações a respeito dele.

De acordo com a documentação, ele relaciona os seguintes dados sobre um arquivo:

  • nome do arquivo
  • nome do usuário que é dono dele
  • nome do grupo a que ele pertence
  • informações sobre permissões

Vamos ver um exemplo, para clarear o assunto:


getfacl /etc/machine-info 

getfacl: Removing leading '/' from absolute path names
# file: etc/machine-info
# owner: root
# group: root
user::rw-
group::r--
other::r--

O resultado do comando, acima, mostra uma mensagem informativa de que ele removeu o primeiro ‘/’ do nome do arquivo — para facilitar a compreensão.
Em seguida, ele mostra o nome do arquivo, seguido pelo usuário e grupo a que ele pertence.
As 3 últimas linhas mostram o ACL (Access Control List), ou seja, a “lista de controle de acesso” — o que cada um (usuário, grupo e outros) pode fazer com o arquivo: (r)ead (ler) e (w)rite (escrever).
No caso do exemplo, o superusuário é o único que pode alterar o arquivo. Os outros podem apenas ler.
Se o getfacl for usado contra um sistema de arquivos que não suporta ACLs, ele exibe as permissões de acesso definidas no modo tradicional de bits de permissão.

Exemplos de uso do getfacl

É possível rodar o programa contra vários arquivos, de uma vez só, usando curingas:


getfacl Documentos/Unigine_Benchmark*

# file: Documentos/Unigine_Benchmark.html
# owner: mclane
# group: mclane
user::rw-
group::r--
other::r--

# file: Documentos/Unigine_Benchmark.html
# owner: justincase
# group: justincase
user::rw-
group::r--
other::r--

É possível usar o comando setfacl para ajustar as permissões, bem como atributos de dono, de seus arquivos.
No exemplo acima, observe que o primeiro arquivos pertence ao usuário ‘mclane’.
Vamos dar permissões de leitura e escrita dele ao usuário ‘justincase’. Veja como:


setfacl -m u:justincase:rw- Unigine_Benchmark.html

getfacl Unigine_Benchmark.html 

Veja o rsultado, na 5a linha:

# file: Unigine_Benchmark.html
# owner: mclane
# group: mclane
user::rw-
user:justincase:rw-
group::r--
mask::rw-
other::r--

Se você tiver “permissão negada” para ajustar as permissões de um arquivo com o setfacl, execute com privilégios administrativos.

Referências

http://linuxcommand.org/man_pages/getfacl1.html.