Script para excluir arquivos de texto

Script para excluir arquivos de texto

Eu estava tentando fazer um script que procurasse todos os arquivos de texto ASCII no diretório que você indicou e depois escrevesse o caminho de cada arquivo em um arquivo de texto. Depois disso, você deve mostrar o cabeçalho de cada arquivo um por um e perguntar se deseja excluir o arquivo. Se você disser sim, ele removerá esse arquivo, se você disser outra coisa, apenas 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"

Então, como saída, suponho que verei 10 linhas do primeiro arquivo de texto em meu diretório e questionarei se desejo remover esse arquivo. Depois que eu responder com "Sim", ele deverá remover esse arquivo e me mostrar as 10 linhas do próximo arquivo e etc.

A saída que recebo agora são as primeiras 10 linhas de 2 arquivos (tenho 4 arquivos em meu diretório) e a pergunta "Deseja excluir este arquivo?" e então o script quebra.

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


OK, já que não tenho reputação suficiente para me responder, coloquei aqui.


Sim, continuei com meu script antigo, onde tive problemas ao juntar dois $$ como $$numb e substituí-los por ${!numb} e comecei a funcionar ... então agora posso limpar meus diretórios do texto arquivos 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 remova sleep 1=)

Responder1

O problema é que você está lendo o arquivo comdoisinstâncias de read- uma para ler o nome do arquivo e outra para obter a resposta. Portanto, a readespera pela resposta consome 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 algo como:

#!/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<&0que alimentará regularmente stdino descritor de arquivo 3, que é então verificado no ciclo para resposta do usuário.

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

Responder2

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

informação relacionada