2011-01-27 36 views
11

Thật khó để giải thích trong tiêu đề.Tập lệnh Bash để xóa tất cả trừ N tệp khi được sắp xếp theo thứ tự abc

Tôi có tập lệnh bash chạy hàng ngày để sao lưu một thư mục vào tệp zip. Các tệp zip được đặt tên là thế giớiYYYYMMDD.zip với YYYYMMDD là ngày sao lưu. Những gì tôi muốn làm là xóa tất cả trừ 5 bản sao lưu gần đây nhất. Sắp xếp các tệp theo thứ tự bảng chữ cái sẽ liệt kê các tệp cũ nhất trước tiên, vì vậy về cơ bản tôi cần xóa tất cả trừ 5 tệp cuối cùng khi được sắp xếp theo thứ tự bảng chữ cái.

+0

Điều này có nghĩa là phải được thực hiện thủ công bất cứ khi nào bạn cảm thấy bạn có quá nhiều bản sao lưu hoặc mỗi lần tập lệnh bash được chạy? – cledoux

+0

@ chaz8705 Tôi sẽ sử dụng nó theo cả hai cách – sgtFloyd

+0

Lưu ý rằng hầu hết các câu trả lời sẽ không thành công với tên tệp có chứa dấu cách. –

Trả lời

18

Dòng sau sẽ thực hiện thủ thuật.

ls -F world*.zip | head -n -5 | xargs rm 
  • ls -F: Liệt kê các tập tin theo thứ tự abc
  • head -n -5: Lọc ra tất cả các dòng ngoại trừ người cuối cùng 5
  • xargs rm: loại bỏ mỗi tập tin nhất định.
+2

er… bao gồm 'ls -AF world * .zip' sẽ tốt hơn. – Benoit

+0

@Benoit, cảm ơn, đã cập nhật! – aioobe

+1

'ls -F' bổ sung thêm phần đuôi tàu vào cuối tên tệp và không được sử dụng. '-A' là không cần thiết vì không có tệp nào bị ẩn. –

3

Làm thế nào về điều này:

find /your/directory -name 'world*.zip' -mtime +5 | xargs rm 

thử nghiệm nó trước đây. Điều này sẽ xóa tất cả các tệp world*.zip cũ hơn 5 ngày. Một logic khác với bạn.

+0

Mặc dù điều này có ý nghĩa nhất, tôi không muốn xóa dựa trên ngày tệp. Nếu tập lệnh sao lưu không thành công, tôi vẫn muốn giữ lại 5 câu lệnh gần đây nhất, vì vậy câu trả lời của aioobe là tốt nhất cho tôi. – sgtFloyd

+0

{} thực sự phải được thoát hoặc trong dấu ngoặc kép. Tôi biết nó hoạt động trong trường hợp này, nhưng nó vẫn là thực hành tốt và được đề nghị bởi trang người đàn ông. – cledoux

+0

@ chaz8705 - đã chỉnh sửa bằng xargs – eumiro

0
ls | grep ".*[\.]zip" | sort | tail -n-5 | while read file; do rm $file; done 
  • sort loại các tập tin
  • tail -n-5 trả về tất cả nhưng 5 gần đây nhất
  • các while vòng lặp nào để xóa
+1

Không. Thao tác này sẽ xóa 5 tệp. Tác giả muốn tất cả nhưng 5 và grep -c đếm các tệp. – Benoit

+0

@Benoit Là một lỗi đánh máy mà tôi đã sửa. – marcog

+1

có thể làm 'echo world * .zip | sắp xếp | đuôi -n -5 | xargs rm' hiệu quả hơn. – Benoit

1

tôi không thể kiểm tra nó ngay bây giờ bởi vì tôi don không có máy Linux, nhưng tôi nghĩ nó phải là:

rm `ls -A | head -5` 
0

ls world*.zip | sort -r | tail n+5 | xargs rm

sort -r sẽ sắp xếp theo thứ tự đảo ngược, vì vậy mới nhất sẽ có mặt tại

tail n+5 dòng chí sản lượng hàng đầu, bắt đầu với 5

xargs rm sẽ loại bỏ các tập tin. Xargs được sử dụng để chuyển stdin thành tham số cho rm.

+0

'grep' là không cần thiết. –

+0

đã chỉnh sửa và thêm séc cho thế giới * trong khi tôi ở đó. – cledoux

Các vấn đề liên quan