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 read
espera 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<&0
que alimentará regularmente stdin
o 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