我需要编写一个脚本,逐个显示所有大于 1M 的文件(在当前目录中),并在显示每个文件后询问用户是否要删除它(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
在已经包含的 while 循环中不起作用read -r output
,但我不知道在这种情况下我能做什么。
答案1
使用一个函数并像这样调用它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"' _ {} \;
答案2
是的,std 输入读取有双重用途。
在这种情况下,您可以简单地从控制终端设备读取:
在第 7 行,添加</dev/tty
read -r -p "Would you like to delete the file? [Y/n] " input</dev/tty