2012-06-25 21 views
89

Tôi đang cố gắng tìm ra lệnh xóa các tệp sql cũ hơn 15 ngày.Dòng lệnh: đường ống tìm kết quả đến rm

Phần tìm kiếm đang hoạt động nhưng không hoạt động.

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f \(-name '*.sql' \) -mtime +15 

Nó đưa ra danh sách chính xác các tệp tôi muốn xóa nhưng không xóa chúng. Các đường dẫn là chính xác.

usage: rm [-f | -i] [-dIPRrvW] file ... 
     unlink file 
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql 
... 
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql 

Tôi đang làm gì sai?

Trả lời

186

Bạn đang thực sự piping rm 's đầu ra vào đầu vào của find. Những gì bạn muốn là sử dụng đầu ra của find như luận để rm:

find -type f -name '*.sql' -mtime +15 | xargs rm 

xargs là lệnh rằng "cải đạo" đầu vào tiêu chuẩn của nó vào lập luận của một chương trình khác, hoặc, như họ chính xác hơn đặt nó trên các man trang,

xây dựng và thực hiện các dòng lệnh từ đầu vào tiêu chuẩn

Lưu ý rằng nếu tên tập tin có thể chứa các ký tự khoảng trắng, bạn nên sửa cho rằng:

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm 

Nhưng trên thực tế, find có một phím tắt cho việc này: các -delete tùy chọn:

find -type f -name '*.sql' -mtime +15 -delete 

Xin lưu ý của cảnh báo sau đây trong man find:

Warnings: Don't forget that the find command line is evaluated 
    as an expression, so putting -delete first will make find try to 
    delete everything below the starting points you specified. When 
    testing a find command line that you later intend to use with 
    -delete, you should explicitly specify -depth in order to avoid 
    later surprises. Because -delete implies -depth, you cannot 
    usefully use -prune and -delete together. 

PS Lưu ý rằng đường ống trực tiếp đến rm không phải là một tùy chọn, bởi vì rm không mong đợi tên tệp trên đầu vào tiêu chuẩn. Những gì bạn đang làm là đưa chúng ngược trở lại.

+1

Cảm ơn. Tôi đọc trang người đàn ông và thử cờ đó. Tôi đang đi qua một con đường đầy đủ nhưng nhận lại "/ usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups /: đường dẫn tương đối có khả năng không an toàn". Bất kỳ ý tưởng tại sao? – jerrygarciuh

+1

@jerrygarciuh hãy xem [tại đây] (http://www.mail-archive.com/[email protected]/msg16944.html). –

+0

cảm ơn. Tôi không chắc chắn tôi đã theo dõi bài viết tốt nhưng khi tôi mô phỏng giải pháp của họ và đặt -delete ở cuối lệnh, nó xóa tất cả các tệp sql bất kể thời gian mod ... nhưng nó không có cảnh báo vì vậy tôi đoán đó là sự tiến bộ ... – jerrygarciuh

19
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \; 

sẽ chọn tập tin trong /usr/www/bar/htdocs già hơn 15 ngày và loại bỏ chúng.

0

Một phương pháp đơn giản khác là sử dụng lệnh locate. Sử dụng nó xargs.

Ví dụ,

locate file.txt | xargs rm 
locate *something* | xargs rm 
0

Giả sử bạn đang không ở trong thư mục chứa các tập tin sao lưu * sql:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \; 

Các tùy chọn -v trên là tiện dụng nó sẽ verbosely đầu ra mà file đang bị xóa khi chúng bị xóa.

Tôi thích liệt kê các tệp sẽ bị xóa trước tiên để đảm bảo. E.g:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;