Posts Tagged ‘Linux’

Apagar diretórios vazios no Linux

20/07/2011

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!

Comando shell que converte em arquivos MP3 as músicas de um CD de áudio

08/08/2010

Outro dia descobri o cdda2mp3, que é um comando (na verdade é um script, mas não conta pra ninguém 😉 ) do Shell que permite extrair e converter para arquivos MP3 as faixas de um CD de áudio.

Exemplo de utilização:

cdda2mp3 <NomeDosArquivos>

As músicas extraídas terão os formato de nomes 01 – NomeDosArquivos.mp3

É bom mencionar que ele apenas converte o áudio,  não extrai nenhuma informação sobre o artista, ou nome da música.

Listar somente Diretórios no Linux

25/07/2008

Para mostrar somente os diretórios no shell do Linux, basta utilizar o comando ls. Conforme o exemplo abaixo:

ls -d */

O resultado será a listagem de todos os diretórios abaixo do atual. A saída será em várias colunas. Encontrei essa solução no blog oblogdefelix.blogspot.com. Lá, o autor explica que os nomes de diretórios, para o shell, sempre terminam com uma barra (“/”). Além disso, a opção -d serve para mostrar somente os diretórios, ao invés dos seus conteúdos.

Se você quiser ver um diretório por linha, ou em outras palavras, a listagem será em uma única coluna,  é só digitar :

ls -d -1 */

O menos -1 é a opção que mostra cada item da listagem em uma linha.

Inté+. Saudações Mocorongas.


%d blogueiros gostam disto: