Không có sáu cách để làm điều này, có cách cũ và cách mới. Cách cũ là với File :: Find, và bạn đã có một vài ví dụ về điều đó. File :: Find có một giao diện gọi lại khá khủng khiếp, nó đã được mát mẻ 20 năm trước, nhưng chúng tôi đã chuyển từ đó.
Đây là chương trình thực tế (được chỉnh sửa nhẹ) mà tôi sử dụng để xóa bỏ chuyến bay trên một trong các máy chủ sản xuất của mình. Nó sử dụng File :: Find :: Rule, thay vì File :: Find. Tệp :: Tìm :: Quy tắc có giao diện khai báo dễ đọc dễ đọc.
Randal Schwartz cũng đã viết Tệp :: Trình tìm kiếm, dưới dạng trình bao bọc trong Tệp :: Tìm. Nó khá đẹp nhưng nó chưa thực sự cất cánh.
#! /usr/bin/perl -w
# delete temp files on agr1
use strict;
use File::Find::Rule;
use File::Path 'rmtree';
for my $file (
File::Find::Rule->new
->mtime('<' . days_ago(2))
->name(qr/^CGItemp\d+$/)
->file()
->in('/tmp'),
File::Find::Rule->new
->mtime('<' . days_ago(20))
->name(qr/^listener-\d{4}-\d{2}-\d{2}-\d{4}.log$/)
->file()
->maxdepth(1)
->in('/usr/oracle/ora81/network/log'),
File::Find::Rule->new
->mtime('<' . days_ago(10))
->name(qr/^batch[_-]\d{8}-\d{4}\.run\.txt$/)
->file()
->maxdepth(1)
->in('/var/log/req'),
File::Find::Rule->new
->mtime('<' . days_ago(20))
->or(
File::Find::Rule->name(qr/^remove-\d{8}-\d{6}\.txt$/),
File::Find::Rule->name(qr/^insert-tp-\d{8}-\d{4}\.log$/),
)
->file()
->maxdepth(1)
->in('/home/agdata/import/logs'),
File::Find::Rule->new
->mtime('<' . days_ago(90))
->or(
File::Find::Rule->name(qr/^\d{8}-\d{6}\.txt$/),
File::Find::Rule->name(qr/^\d{8}-\d{4}\.report\.txt$/),
)
->file()
->maxdepth(1)
->in('/home/agdata/redo/log'),
) {
if (unlink $file) {
print "ok $file\n";
}
else {
print "fail $file: $!\n";
}
}
{
my $now;
sub days_ago {
# days as number of seconds
$now ||= time;
return $now - (86400 * shift);
}
}
Tôi nghĩ rằng bạn có thể gặp vấn đề với tính đơn giản, thường trong đơn giản perl không phải là giải pháp tốt nhất hay thanh lịch nhất. –
Điểm tốt, cảm ơn. Tôi sẽ để nó cho tất cả mọi người để băm ra câu trả lời của họ nếu họ cảm thấy nó thêm vào giải pháp của họ. – keparo