Скрипт для удаления текстовых файлов

Скрипт для удаления текстовых файлов

Я пытался создать скрипт, который ищет все текстовые файлы ASCII в указанном вами каталоге, а затем записывает путь к каждому файлу в текстовый файл. После этого он должен показывать заголовок каждого файла по одному и спрашивать, хотите ли вы удалить файл. Если вы говорите «да», он удаляет этот файл, если вы говорите что-то еще, он просто показывает вам следующий файл и т. д., пока вы не проверите каждый файл. Итак, я закончил с:

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

Итак, в качестве вывода я предполагаю увидеть 10 строк из первого текстового файла в моем каталоге и спросить, хочу ли я удалить этот файл. После того, как я отвечу "Да", предполагается удалить этот файл и показать мне 10 строк из следующего файла и т. д.

Вывод, который я получаю сейчас, — это первые 10 строк из 2 файлов (у меня в каталоге 4 файла) и вопрос «Вы хотите удалить этот файл?», а затем скрипт прерывается.

Кажется, это не работает так, как ожидалось. Может кто-нибудь объяснить мне, где моя ошибка?


Ладно, поскольку у меня недостаточно репутации, чтобы ответить самому, я оставлю это здесь.


Да, поэтому я продолжил использовать свой старый скрипт, в котором у меня возникли проблемы с объединением двух $$, например, $$numb, и заменил их на ${!numb}, и это начало работать... так что теперь я могу очистить свои каталоги от текстовых файлов, которые мне не нужны, с помощью этого скрипта=)

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

P.S. чтобы было быстрее удалите sleep 1=)

решение1

Проблема в том, что вы читаете файл с помощьюдваэкземпляры read- один для чтения имени файла, другой для получения ответа. Следовательно, ожидание readответа съедает каждое второе имя файла, и вы должны надеяться, что список файлов не будет выглядеть так:

some_throuwaway_stuff
foo
very_important_file.txt
Yes
some_throuwaway_stuff
foo

Ваш сценарий, вероятно, должен выглядеть примерно так:

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

Обратите внимание на перенаправление exec 3<&0, которое направляет обычный файл stdinна дескриптор файла 3, который затем проверяется в цикле на наличие ответа от пользователя.

Тем не менее, rm -iэто, вероятно, лучший вариант.

решение2

Вы можете заменить свой блок

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

к

while [ $numb -gt 0 ]
do
    head ${!numb}
    rm -i ${!numb}
    numb=$[$numb-1]
done

Связанный контент