bash script duvidas..

Zed_Blade

Power Member
Boas,

A minha pesquisa não devolveu nada, portanto assumo que ainda não foi perguntado isto. No google também não achei nada que satisfizesse o pedido:

Vou ter entretanto uma avaliação no que respeita a BASH e Perl, mas tenho um exercicio (para praticar) que não estou a conseguir resolver e não sei o que estou a fazer mal.. (também não percebo grande coisa disto.

Basicamente tenho que fazer um script que recebe um dir como argumento e vai percorrer todo esse dir e sub dirs à procura de pastas vazias.
Cada pasta vazia que encontrar deverá perguntar ao utilizador se a quer apagar ou não.

Estou a ter problemas com isto e queria que alguém visse o código e me corrija sff:
Código:
#!/bin/bash

if [ ! -d "$1" ]; then
    echo "dir nao existente" [COLOR="SeaGreen"]#se dir $1 não existir[/COLOR]
else
    lista = ls $1 `find -depth -type d -empty`
[COLOR="SeaGreen"] #o comando que faz a pesquisa por pastas vazias[/COLOR]

    for i in lista
    do
        echo "Apagar dir\" $i \"? (s/n/Abortar)"
        read $REPLY
        case $REPLY in
            s|S) do `rmdir $i`;;
            n|N) exit 1;;
            A) exit 0;;
        esac
    done
fi

Julgo que está algo relacionado com o "for i in lista" mas não chego à solução..

Cumps.
 
Esse rmdir estará a tentar apagar o directório certo? No i guardas o caminho absoluto ou em relação a pasta de onde estás a correr?
 
Última edição:
O i é suposto ser a iteração dos elementos de lista, que (mais uma vez) é suposto guardar todas as subdir do argumento (ou seja, a pasta que quero que seja analisada) que estão vazios..
 
Não é mais simples com uma função recursiva ?

Código:
#!/bin/bash

function dir_empty() {
	if [ `ls $1 | wc -l` -eq 0 ] ; then
		echo "Apagar dir \"$1\"? (s/n/Abortar)"
		read $REPLY
		case $REPLY in
			s|S) rmdir $1 ;;
			n|N) continue ;;
			A) exit 0 ;;
		esac
	else	
		for i in `ls $1` ; do
			if [ -d "$1/$i" ] ; then
				dir_empty "$1/$i"
			fi
		done
	fi
}

if [ ! -d "$1" ]; then
	echo "dir nao existente" #se dir $1 não existir
else
	dir_empty "$1"
	exit
fi
 
Não é mais simples com uma função recursiva ?

Não sou grande entendido na matéria mas julgo que essa não é a melhor solução. Necessito mesmo que guarde todas as pastas vazias para depois apagar e pelo (pouco) que percebi do teu código, aquela função não faz isso de forma recursiva. Faz apenas para a directoria que lhe dás..

Imagina que tens uma directoria com mais 5 sub dir e cada sub com outras 5 todas elas vazias..
Esse código (julgo) que não lida com isso..
 
Olá.

Se fizeres as seguintes alterações ao teu código, deverá funcionar:
Código:
[COLOR=PaleGreen]--- old.sh      Fri Sep  5 20:19:13 2008
+++ new.sh      Fri Sep  5 20:17:57 2008[/COLOR]
@@ -3,15 +3,15 @@
 if [ ! -d "$1" ]; then
     echo "dir nao existente" #se dir $1 não existir
 else
[COLOR=Plum]-    lista = ls $1 `find -depth -type d -empty`[/COLOR]
[COLOR=LightBlue]+    lista=`find $1 -depth -type d -empty`[/COLOR]
  #o comando que faz a pesquisa por pastas vazias

[COLOR=Plum]-    for i in lista[/COLOR]
[COLOR=LightBlue]+    for i in $lista[/COLOR]
     do
         echo "Apagar dir\" $i \"? (s/n/Abortar)"
         read $REPLY
         case $REPLY in
[COLOR=Plum]-            s|S) do `rmdir $i`;;[/COLOR]
[COLOR=LightBlue]+            s|S) rmdir $i;;[/COLOR]
             n|N) exit 1;;
             A) exit 0;;
         esac
Tens alguns bugs, por exemplo: se responderes n ou N, a meio da execução, sais logo do script; presumo que o que pretendes é continuar a execução e perguntar se o utilizador pretende, ou não, remover os restantes directórios vazios (caso existam).

Cumps,
JP
 
Mais uma sugestão, em Perl:

Código:
#!/usr/bin/perl 

use strict;
use warnings;
use File::Find::Rule::DirectoryEmpty;

my $dir = $ARGV[0];

system('clear');

if ( !$dir || !-d $dir ) {
    print "Pasta não existente!\n";
    exit;
}

recursive($dir);

sub recursive {

    my $pasta = shift;

    my @dirs_vazias = File::Find::Rule->directoryempty->in("$pasta");

    my $eliminadas;

    if ( scalar @dirs_vazias < 1 ) {

        print "Não existem pastas vazias em $pasta. \n";

    }
    else {

        foreach my $pasta_vazia (@dirs_vazias) {

            print "A pasta $pasta_vazia esta' vazia. Apagar? (s|N): ";

            chomp( my $resposta = <STDIN> );

            if ( $resposta =~ /^s$/i ) {

                #
                # Se a resposta é 's' ou 'S', apagamos a pasta
                #
                rmdir $pasta_vazia or die $!;
                print "\t*** A pasta $pasta_vazia foi eliminada ***\n\n";
                $eliminadas++;

            }

        }

        #
        # Se o utilizador apagou alguma pasta, vamos procurar novamente a partir
        # da pasta inicial, uma vez que agora podem existir novas pastas vazias
        #
        recursive($pasta) if $eliminadas;
    }

    return;
}
 
Não sou grande entendido na matéria mas julgo que essa não é a melhor solução. Necessito mesmo que guarde todas as pastas vazias para depois apagar e pelo (pouco) que percebi do teu código, aquela função não faz isso de forma recursiva. Faz apenas para a directoria que lhe dás..

Imagina que tens uma directoria com mais 5 sub dir e cada sub com outras 5 todas elas vazias..
Esse código (julgo) que não lida com isso..
Experimentaste sequer?
 
Experimentaste sequer?

Não cheguei a experimentar, mas de qualquer forma, obrigado pela ajuda a todos.

Estive sem internet desde a hora que fiz o ultimo post mas lá cheguei à conclusão de como era sozinho..
Estive a reler alguns básicos de bash e lá cheguei à razão dos erros.
Um dos quais vem das minhas manias de programação.. Era os espaços em lista = find(...), que de facto não podem existir.. My bad


Ficou de facto como o countzero estava a dizer para fazer as alterações. Acho que ficou mesmo igual ao que ele me disse p corrigir, mas não vou verificar agora..

Mais uma vez, obrigado a todos :009:

EDIT: Por acaso não ficou igual ao que ele disse.. Eu cheguei a dar com o erro do n|N e meti lá o continue :P
 
Última edição:
Back
Topo