Script para eliminar archivos de texto

Script para eliminar archivos de texto

Estaba intentando crear un script que busque todos los archivos de texto ASCII en el directorio que usted señala y luego escriba la ruta de cada archivo en un archivo de texto. Después de eso, se supone que debe mostrar el encabezado de cada archivo uno por uno y preguntar si desea eliminar el archivo. Si dice que sí, elimina ese archivo, si dice algo más, simplemente le muestra el siguiente archivo, etc., hasta que revise todos los archivos. Entonces terminé con:

#!/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"

Entonces, como resultado, supongo que veré 10 líneas del primer archivo de texto en mi directorio y me preguntaré si quiero eliminar ese archivo. Después de responder "Sí", se supone que debo eliminar ese archivo y mostrarme las 10 líneas del siguiente archivo, etc.

El resultado que obtengo ahora son las primeras 10 líneas de 2 archivos (tengo 4 archivos en mi directorio) y la pregunta "¿Quieres eliminar este archivo?" y luego el guión se rompe.

Parece que no funciona como se esperaba. ¿Alguien podría explicarme dónde está mi error?


OK ya que no tengo suficiente reputación para responderme lo pongo aquí.


Sí, me quedé con mi antiguo script donde tuve problemas al juntar dos $$ como $$numb y los reemplacé con ${!numb} y comenzó a funcionar... así que ahora puedo limpiar mis directorios del texto. archivos que no necesito con ese 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

PD. para hacerlo más rápido eliminar sleep 1=)

Respuesta1

El problema es que estás leyendo el archivo condosinstancias de read: una para leer el nombre del archivo y la otra para obtener la respuesta. Por lo tanto, la readespera de la respuesta consume cada segundo nombre de archivo, y debes esperar que la lista de archivos no se vea así:

some_throuwaway_stuff
foo
very_important_file.txt
Yes
some_throuwaway_stuff
foo

Su script probablemente debería verse así:

#!/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 la redirección exec 3<&0que alimentará regularmente stdinel descriptor de archivo 3, que luego se verifica en el ciclo para obtener la respuesta del usuario.

Dicho esto, rm -iprobablemente sea una mejor opción.

Respuesta2

Puedes reemplazar tu bloque

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

información relacionada