1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

bash script duvidas..

Discussão em 'Dúvidas e Suporte Técnico - GNU/Linux & *nix' iniciada por Zed_Blade, 5 de Setembro de 2008. (Respostas: 9; Visualizações: 825)

  1. Zed_Blade

    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.
     
  2. raVemjr

    raVemjr I'm cool cuz I Fold

    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: 5 de Setembro de 2008
  3. Zed_Blade

    Zed_Blade Power Member

    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..
     
  4. raVemjr

    raVemjr I'm cool cuz I Fold

    Certo, e $i representa a pasta? Ou representa a ordem da pasta em 'lista'?
     
  5. PrOdG

    PrOdG Power Member

    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
    
     
  6. Zed_Blade

    Zed_Blade Power Member

    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..
     
  7. countzero

    countzero Power Member

    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
     
  8. slack_guy

    slack_guy Power Member

    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;
    }
    
     
  9. PrOdG

    PrOdG Power Member

    Experimentaste sequer?
     
  10. Zed_Blade

    Zed_Blade Power Member

    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: 6 de Setembro de 2008

Partilhar esta Página