Tôi đã viết một tập lệnh xóa tất cả ngoại trừ hai tệp cuối cùng trong một thư mục:
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
Kịch bản này sẽ được thực hiện như một công việc định kỳ mỗi ngày.
Lý do là như sau:
Có được danh sách tất cả các tệp bằng cách sử dụng
ls -1
(để tôi nhận được một tệp trên mỗi dòng);Loại bỏ hai cuối cùng khỏi danh sách bằng cách sử dụng
head -n -2
;Vì
ls
in các đường dẫn tương đối, sử dụngxargs printf
điều để thêm vào đường dẫn thư mục và biến nó thành một đường dẫn tuyệt đối;Gửi cho họ
sudo rm -rf
sử dụngxargs
.
Mọi người đều có quyền truy cập vào thư mục này, vì vậy bất kỳ ai cũng có thể tạo và xóa bất kỳ tệp nào trong thư mục này.
Vấn đề là: sudo rm -rf
thật đáng sợ. xargs sudo rm -rf
là vô cùng đáng sợ.
Tôi muốn chắc chắn rằng không ai có thể làm hỏng các thư mục / hệ thống khác bằng cách tạo các tệp thông minh sẽ bị xóa (vô tình hoặc cố ý). Tôi không biết, một cái gì đó thông minh như:
file with / spaces.txt
mà có thể dẫn đến một siêu đáng sợ sudo rm -rf /
.
EDIT: Lỗi của tôi, tên tệp không thể chứa /
, vì vậy vấn đề cụ thể này sẽ không xảy ra, nhưng câu hỏi về việc liệu có những rủi ro khác hay không vẫn còn tồn tại.
Đây là lý do tại sao tôi đang sử dụng --quoting-style=shell-always
, điều này sẽ ngăn chặn mọi thủ thuật với các tệp có khoảng trắng. Nhưng bây giờ tôi tự hỏi liệu ai đó có thể thông minh hơn với khoảng trắng và dấu ngoặc kép trong tên tệp, có lẽ.
Kịch bản của tôi có an toàn không?
Lưu ý: Tôi cần sudo
bởi vì tôi đang truy cập thư mục từ xa (từ một ổ đĩa mạng được ánh xạ bằng cách sử dụng mount
) và tôi không thể làm cho nó hoạt động mà không có sudo.
/
trong tên tôi đang cố gắng đạt được điều này ở đây không
ls
đầu ra, đây đã là một lệnh được viết kém, ngay cả khi trích dẫn. ls
cũng sử dụng Locale cho thứ tự sắp xếp, tôi nghĩ, vì vậy tôi không thấy mục đích của những gì head
trong việc loại bỏ cuối cùng 2 (trừ khi bạn đang cố gắng để thoát khỏi .
và ..
đó iirc không được phép làm đối số cho rm
Chỉ cần sử dụng anyway. find /path/to/folder -type f delete
. Và không sudo
nếu bạn chạy từ cron - cron đã ở cấp gốc
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
nào?