逐个显示大于 1M 的文件并要求用户采取进一步操作的脚本?

逐个显示大于 1M 的文件并要求用户采取进一步操作的脚本?

我需要编写一个脚本,逐个显示所有大于 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

相关内容