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

Любой ввод-вывод обрабатывается системным вызовом, вызванным процессом. В конечном счете такой системный вызов будет сочиться свой путь вниз к некоторой соответствующей функции драйвера устройства низкого уровня для выполнения фактической операции ввода-вывода.

Ввод-вывод может быть хитрым - для фактического вкладывания данных и из устройства, различные шаги, возможно, должны быть выполнены в порядке и возможно с синхронизацией требований. Если эти шаги не завершаются атомарно, в следующий раз, когда их пробуют, устройство не может ответить, неправильно себя вести или даже вызвать систему к тупику. Эти шаги могут отличаться и могут быть уникальными для каждого устройства, следовательно почему существует столько драйверов устройств.

Правильно написанный драйвер устройства должен знать, как иметь дело с устройством, которое он пытается обслужить, таким образом, он не должен обычно испытывать проблемы, если нет ошибка драйвера, Вы используете неправильный драйвер для устройства, или физическое устройство перестало работать.

2
17.06.2014, 17:28
2 ответа

Проблема состоит в том, что Вы читаете файл с двумя экземплярами 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 вероятно более оптимальный вариант.

4
27.01.2020, 21:54
  • 1
    лучше является изменением rm кому: rm -f –  بارپابابا 17.06.2014, 17:36
  • 2
    Зависит от обстоятельств. rm имеет много полезных опций, которые могут быть или выгодными или нанести ущерб Вашим данным в зависимости от того, что Вы делаете. –  peterph 18.06.2014, 13:08

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

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
2
27.01.2020, 21:54

Теги

Похожие вопросы