Script para excluir arquivos de texto

2

Eu estava tentando fazer um script que procura por todos os arquivos de texto ASCII no diretório que você aponta e depois que escreve o caminho de cada arquivo para um arquivo de texto. Depois disso, é necessário mostrar a cabeça de cada arquivo, um por um, e perguntar se você deseja excluir o arquivo. Se você disser sim, ele removerá esse arquivo, se você disser outra coisa, ele mostrará o próximo arquivo e etc. até você verificar todos os arquivos. Então acabei com:

#!/bin/bash
echo "Give directory to search for ASCII text files"
read direct
find $direct -type f -exec file {} + | grep ASCII > ztextz
sed "s/ .*//" ztextz > ztextz1
sed "s/://g" ztextz1 > ztextz2
#until here everything works fine
#it creates the file that contains paths of all ASCII text files in the directory given by you
#After that it is a mess..it needs to check the head of every file one by one
#and let me decide if I want to delete it or not
files=ztextz2
while IFS= read -r name;
do
head "$name";

echo "Do you want to delete this file?"
read want
case $want in
YES)
rm $name;;
Yes)
rm $name;;
yes)

rm $name;;
Y)
rm $name;;
y)
rm $name;;
esac
done < "$files"

Assim como a saída, suponho ver 10 linhas do primeiro arquivo de texto em meu diretório e questionar se desejo remover esse arquivo. Depois de responder com "Sim", é suposto remover esse arquivo e mostrar-me as 10 linhas do próximo arquivo e etc.

A saída que obtenho agora são as primeiras 10 linhas de dois arquivos (tenho quatro arquivos no meu diretório) e a pergunta "Deseja excluir esse arquivo?" e então o script quebra.

Parece que não está funcionando como esperado. Alguém poderia me explicar onde está o meu erro?

OK, já que não tenho reputação suficiente para responder a mim mesmo, coloco aqui.

Sim, então eu fiquei com o meu script antigo, onde eu tive problema em colocar dois $$ juntos como $$ numb e substituí-los por $ {! numb} começou a funcionar ... então agora eu posso limpar meus diretórios dos arquivos de texto que eu não preciso com esse script =)

   #!/bin/bash
echo "Give directory to search for ASCII text files"
read direct
find $direct -type f -exec file {} + | grep ASCII > ztextz
sed "s/ .*//" ztextz > ztextz1
sed "s/://g" ztextz1 > ztextz2
set 'less ztextz2'
numb=$#
rm ztextz*
while [ $numb -gt 0 ]
do head ${!numb}
echo "Do you want to delete ${!numb} file?"
read want
case $want in
yes)
rm ${!numb}
echo "File is removed"
sleep 1;;
Yes)
rm ${!numb}
echo "File is removed"
sleep 1;;
Y)
rm ${!numb}
echo "File is removed"
sleep 1;;
y)
rm ${!numb}
echo "File is removed"
sleep 1;;
YES)
rm ${!numb}
echo "File is removed"
sleep 1;;
esac
numb=$[$numb-1]
done

PS. para tornar mais rápido remover sleep 1 =)

    
por Denis 13.10.2013 / 21:47

2 respostas

4

O problema é que você está lendo o arquivo com duas instâncias de read - uma para ler o nome do arquivo e outra para obter a resposta. Portanto, o read esperando pela resposta come cada segundo nome de arquivo, e você deve esperar que a lista de arquivos não se pareça com:

some_throuwaway_stuff
foo
very_important_file.txt
Yes
some_throuwaway_stuff
foo

Seu script provavelmente deve ser parecido com:

#!/bin/bash
echo "Give directory to search for ASCII text files"
read direct
exec 3<&0
find "$direct" -type f |
while IFS= read -r name; do
    echo "========================================"
    if file "$name" | grep ASCII; then
        echo "----------------------------------------"
        head "$name";
        echo "----------------------------------------"
        echo "Do you want to delete this file?"
        read -u 3 want
        case $want in
            YES|Yes|yes|Y|y)
                rm "$name"
                ;;
            *)
                ;;
        esac
    fi
done

Observe o redirecionamento exec 3<&0 , que alimentará stdin ao descritor de arquivo 3, que é então verificado no ciclo para resposta do usuário.

Dito isto, rm -i é provavelmente uma opção melhor.

    
por 13.10.2013 / 23:16
2

Você pode substituir seu bloco

while [ $numb -gt 0 ]
    do head ${!numb}
    echo "Do you want to delete ${!numb} file?"
    read want
    case $want in
        yes)
            rm ${!numb}
            echo "File is removed"
            sleep 1;;
        Yes)
            rm ${!numb}
            echo "File is removed"
            sleep 1;;
        Y)
            rm ${!numb}
            echo "File is removed"
            sleep 1;;
        y)
            rm ${!numb}
            echo "File is removed"
            sleep 1;;
        YES)
            rm ${!numb}
            echo "File is removed"
            sleep 1;;
    esac
    numb=$[$numb-1]
done

por

while [ $numb -gt 0 ]
do
    head ${!numb}
    rm -i ${!numb}
    numb=$[$numb-1]
done
    
por 18.06.2014 / 15:46