Điểm:6

Lệnh `find` của tôi trong tập lệnh không tìm thấy các tệp và thư mục có khoảng trắng trong tên của chúng

lá cờ pr

Cách đây một thời gian, tôi đã viết một kịch bản di chuyển các tệp và thư mục từ Tải xuống đến .Tải xuống nếu chúng cũ hơn 3 ngày và xóa chúng khỏi thư mục này sau 30 ngày. Nó hoạt động tốt, nhưng chỉ dành cho các tệp không có khoảng trắng.

Tôi đã điều tra và thấy rằng tìm thấy lệnh mà tôi sử dụng trong tập lệnh không hoạt động như tôi mong đợi đối với bất kỳ tệp hoặc thư mục nào có dấu cách trong tên của chúng.

Đây là những gì tìm thấy làm:

tìm đầu ra lệnh

tôi mong đợi để xem tìm thấy lệnh cũng tìm các tệp có khoảng trắng.

Đây là kịch bản:

#! /bin/bash
# đặt -x
xuất HIỂN THỊ =: 0,0

# true - xóa, khác - di chuyển
quy trình hàm(){
    nếu [ "$2" = "XÓA" ]; sau đó
        rm -r "$1" && thông báo-gửi "$3 $1 đã xóa!"
    khác
    mv "$1" "../.Tải xuống/$1" && thông báo-gửi "$3 $1 đã chuyển sang ~/.Tải xuống/$1!"
    fi
}

# xóa thư mục rỗng
cho emptyDir trong `find ~/Desktop/ ~/Downloads/ -empty -type d`; làm
    thông báo-gửi "Directoy $emptyDir đã bị xóa, vì trống!"
xong
tìm ~/Máy tính để bàn/ ~/Tải xuống/ -empty -type d -delete

# xóa/di chuyển tập tin/thư mục cũ
nếu [ -z "$1" ] || [ "${1,,}" != "xóa" ] && [ "${1,,}" != "di chuyển" ]; sau đó
    echo "Cho dưới dạng chế độ tham số ( xóa / di chuyển )"
    lối ra
fi

nếu [ "${1,,}" == "xóa" ]; sau đó
    ngày=30
    đường dẫn = ".Tải xuống"
    chế độ = "XÓA"
khác
    ngày=2
    đường dẫn = "Tải xuống"
    chế độ = "DI CHUYỂN"
  cr  
  nếu [ ! -d "~/.Tải xuống" ]; sau đó
    mkdir -p ~/.Downloads
  fi
fi

cd ~/$path

cho phần tử trong *
làm
    nếu [ -d "$element" ]; sau đó
        if [ $(find "$element" -type f -mtime -$day | wc -l) -eq 0 ]; sau đó
            xử lý "$element" "$mode" "Directory"
        fi
    khác
        if [ $(find `pwd` -name "$element" -mtime +$day | wc -l) -gt 0 ]; sau đó
            xử lý "$element" "$mode" "File"
        fi
    fi
xong

Tôi vui lòng yêu cầu bạn cho tôi biết những gì tôi có thể làm sai.

Cảm ơn trước!

GammaGames avatar
lá cờ in
Bạn có thể đặt một cái gì đó đơn giản như `@reboot [username] find ~/Downloads/ -mtime +3 -exec gio Trash {} \;` trong crontab của bạn. Bản phân phối của tôi được đặt để xóa các tệp rác sau 30 ngày, nhưng điều đó cũng có thể được thực hiện thủ công với gói `trash-cli`.
Điểm:13
lá cờ hr

tl;dr: không phải dấu cách, mà là dấu ngoặc1

Các tìm thấy lệnh của -Tên kiểm tra sử dụng các biểu thức toàn cục shell - việc thêm dấu ngoặc kép xung quanh đối số sẽ ngăn không cho các ký tự đặc biệt của toàn cục được diễn giải bởi bạn vỏ bọc, nhưng tìm thấy vẫn yêu cầu họ phải trốn thoát.

Bán tại.

$ touch 'tên tệp có [dấu ngoặc] trong đó'
$ tìm thấy . -name 'tên tệp có [dấu ngoặc] trong đó'
$

(không có kết quả - vì [dấu ngoặc] có nghĩa là bất kỳ ký tự đơn nào trong tập hợp b, r, một, c, k, e, t, S); nhưng trái lại

$ tìm thấy . -name 'tên tệp có \[ngoặc\] trong đó'
./filename với [ngoặc] trong đó

Nếu bạn cần thực hiện điều này theo chương trình, có lẽ bạn có thể sử dụng bash shell's bản inf để thêm các lối thoát cần thiết:

$ element='tên tệp có [dấu ngoặc] trong đó'
$ tìm thấy . -tên "$(printf '%q' "$element")"
./filename với [ngoặc] trong đó

  1. tuy nhiên bạn SẼ gặp sự cố với khoảng trắng trong dòng

    cho emptyDir trong `find ~/Desktop/ ~/Downloads/ -empty -type d`; làm
    

    Nhìn thấy Tại sao việc lặp qua đầu ra của find lại là thông lệ không tốt?

  2. có một số vấn đề khác, ví dụ như trích dẫn ~ Trong [ ! -d "~/.Tải xuống" ] sẽ không mở rộng đến $HOME - nói chung bạn nên tránh ~ trong kịch bản

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.