Tập lệnh hiển thị các tệp lớn hơn 1M từng cái một và yêu cầu thêm hành động từ người dùng?


0

Tôi cần phải viết một tập lệnh sẽ hiển thị tất cả các tệp lớn hơn 1M một (trong thư mục hiện tại) và sau mỗi tệp được hiển thị để hỏi người dùng liệu anh ta có muốn xóa nó hay không, sau đó anh ta có muốn để nén nó và cuối cùng là một tùy chọn để bỏ qua nó. Sau khi người dùng chọn một hành động, tệp tiếp theo sẽ được hiển thị với cùng các tùy chọn được cung cấp.

Đó là những gì tôi quản lý để viết cho đến nay, nhưng đầu ra cho tôi tên của tệp đầu tiên (Từng thứ một hoạt động) và đưa ra 'Đầu vào không hợp lệ' trên dòng sau.

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

Rõ ràng với tôi rằng read -r -p inputnó không hoạt động trong vòng lặp while đã chứa read -r output, nhưng tôi không thấy những gì tôi có thể làm trong tình huống này.


FWIW, bạn có thể thực hiện một số cải tiến cho tập lệnh mà không thay đổi những gì nó làm. Đây là cách tôi sẽ viết nó: pastebin.com/bCVypq74
wjandrea

Câu trả lời:


1

Sử dụng một chức năng và gọi nó như thế này find [...] -exec bash -c 'myFunction "$1"' _ {} \;.

ví dụ như một cái gì đó như thế này:

#!/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"' _ {} \;

0

Có, có một sử dụng kép của đầu vào std đọc.
Trong trường hợp đó, bạn chỉ cần đọc từ thiết bị đầu cuối điều khiển:

ở dòng 7, thêm </dev/tty

read -r -p "Would you like to delete the file? [Y/n] " input</dev/tty
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.