Apagar diretórios vazios no Linux

O comando que permite pesquisar uma árvore de diretórios, apagando os que estiverem vazios é:

 find . -type d -depth -empty -print -exec rmdir {} \; 

Descobri esse comando outro dia quando precisei apagar vários diretórios vazios que estavam no meio de outros com conteúdo. A minha primeira ação foi utilizar o Nautilus (navegador de arquivos do Gnome), contudo depois de algum tempo perdido na tarefa “braçal” e monótona de verificar se um diretório estava vazio para então removê-lo, resolvi usar os neurônios para encontrar uma solução mais eficiente. Parti para “força” por trás das interfaces gráficas, fui ao Shell.

Inicialmente, pensei logo em escrever um script, mas mudei de idéia rapidamente, pois isso demandaria tempo e um certo trabalho. Eu queria uma solução mais rápida e que evitasse a fadiga ;-). Portanto, fui “fuçar” o sistema em busca de algum comando ou script que resolvesse o meu problema.

Utilizei o comando apropos para verificar quais comandos eram relacionados a diretórios:

apropos directories 

A saída do comando foi essa:

cleanlinks (1)       - remove dangling symbolic links and empty directories
cp (1)               - copy files and directories
fdupes (1)           - finds duplicate files in a given set of directories
mkdir (1)            - make directories
rm (1)               - remove files or directories
rmdir (1)            - remove empty directories

Comecei as minhas tentativas pelo rmdir.  Li em sua página de manual que ele apagava diretórios vazios.  Era exatamente isso que eu queria. Utilizei o comando:

 rmdir */

Ele apagou somente os diretórios que estavam sem conteúdo. Mas aqueles que tinham subdiretórios vazios, ficaram. Na prática eles eram apenas uma cadeia de diretórios contendo outros diretórios sem qualquer arquivo.

Pensei que teria mesmo de desenvolver um script, quando resolvi testar o comando cleanlinks. Na sua página de manual é informado que ele remove  links simbólicos pendentes e diretórios vazios.

cleanlinks

Fiquei surpreso com a objetividade do comando, pois ele não tem opções e nem pergunta nada. Apenas sai varrendo todos os diretórios abaixo do atual e apaga os que estiverem vazios.

Bateu a curiosidade. Como é que ele faz isso? Será que é um script ou um binário?

Uma das partes boas do Software Livre é que podemos ver os códigos fontes dos programas. Resolvi tentar ver como esse comando funcionava internamente. Para isso, precisava saber onde ele ficava armazenado, portanto usei o whereis:

whereis cleanlinks  cleanlinks: /usr/bin/cleanlinks /usr/share/man/man1/cleanlinks.1.gz

Descobri que o programa era um script. Para ver o seu código fonte bastou digitar:

vi /usr/bin/cleanlinks

Cujo resultado foi:

#!/bin/sh
#
# Copyright © 2000, 2003 by The XFree86 Project, Inc
#
# Remove dangling symlinks and empty directories from a shadow link tree
# (created with lndir).
#
# Author: David Dawes <dawes@xfree86.org>
#
# $XFree86: xc/config/util/cleanlinks.sh,v 1.2 2003/04/15 03:05:16 dawes Exp $
find . -type l -print |
(
   read i
   while [ X"$i" != X ]; do
      if [ ! -f "$i" ]; then
         echo $i is a dangling symlink, removing
         rm -f "$i"
      fi
      read i
   done
)

echo Removing empty directories ...
#find . -type d -depth -print | xargs rmdir > /dev/null 2>&1
find . -type d -depth -empty -print -exec rmdir {} \;
exit 0

Vi que a linha de comando responsável por apagar os diretórios vazios recursivamente era:

find . -type d -depth -empty -print -exec rmdir {} \;

Basicamente o funcionamento dessa linha é:

  1. . (ponto) indica que o find deve iniciar a busca a partir do diretório atual;
  2. -type d deve procurar somente por diretórios;
  3. -depth processar cada conteúdo do diretório antes do diretório em si;
  4. -empty selecionar somente os diretórios vazios;
  5. -print -exec rmdir {} \; apaga cada diretório encontrado que atenda as condições anteriores.

Uma última informação: o cleanlinks faz parte do pacote xutils-dev que não vem por padrão no Ubuntu.  Se quiser usar o primeiro é necessário instalar  o segundo.

Até a próxima!

Anúncios

Tags: ,

3 Respostas to “Apagar diretórios vazios no Linux”

  1. Luiz Sanches Says:

    Égua! Macetes valiosos!

  2. Cléoson Barreto Says:

    Fala François!
    Excelente post, uma aula simples mas interessante sobre shell-script, Linux e Software Livre!
    Parabéns!

  3. Liberalino Maia Says:

    Excelente! Good job, meu camarada! Quebrou um galhão.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s


%d blogueiros gostam disto: