Я должен записать сценарий, который отобразил бы все файлы, больше, чем 1M один за другим (в текущем dir) и после каждого файла, отображенного для выяснения у пользователя, хочет ли он удалить его (Y/n), затем если он хочет сжать его и наконец опция пропустить его. После того, как пользователь выбирает действие, следующий файл должен быть отображен с теми же предлагаемыми опциями.
Именно это мне удалось записать до сих пор, но вывод дает мне название первого файла (Один за другим вещь работы) и дает 'Недопустимый вход' на следующей строке.
#!/bin/bash
find . -maxdepth 1 -type f -size +1M | while read -r output;
do
echo ${output};
read -r -p "Would you like to delete the file? [Y/n] " input
case $input in
[yY][eE][sS]|[yY])
echo "The file has been deleted!"
;;
[nN][oO]|[nN])
;;
*)
echo "Invalid input..."
exit 1
;;
esac
done
Это ясно мне это read -r -p input
не работает в цикле с условием продолжения, который уже содержит read -r output
, но я не вижу то, что я мог сделать в этой ситуации.
Используйте функцию и назовите ее как это find [...] -exec bash -c 'myFunction "$1"' _ {} \;
.
, например, что-то вроде этого:
#!/bin/bash
rmziporskip(){
printf 'What should I do with %s ?\n' "$1"
select action in remove zip skip; do
case $action in
remove)
rm "$1";
echo "The file has been deleted!"
;;
zip)
zip "$1.zip" "$1"
rm "$1";
echo "The file has been zipped and the original deleted!"
;;
*)
echo "The file has been skipped!"
;;
esac
break;
done
}
export -f rmziporskip
find . -maxdepth 1 -type f -size +1M -exec bash -c 'rmziporskip "$1"' _ {} \;
Да существует двойное назначение входного чтения станд.
В этом случае, можно просто читать из оконечного устройства управления:
в строке 7, добавьте </dev/tty
read -r -p "Would you like to delete the file? [Y/n] " input</dev/tty