2015-12-17 16 views
5

Có một số chủ đề khác nhau về stackoverflow liên quan đến tìm/xóa thư mục/tệp cũ nhất trong một thư mục. Tôi đã đọc rất nhiều trong số họ và nhìn thấy vô số cách khác nhau mà rõ ràng là làm việc cho một số người trên các hệ thống khác nhưng không phải cho tôi trong trường hợp cụ thể của tôi.xóa tất cả trừ X thư mục cũ nhất trên FreeBSD qua Bash (không có dấu vân tay, có dấu cách, không zsh)

Các trở ngại là:

  • Im trên FreeBSD (Freenas 9,3)
  • Thư mục có khoảng trống trong đó
  • Dont sử dụng ls (http://mywiki.wooledge.org/ParsingLs)
  • có thể không sử dụng -printf của find (doesnt tồn tại cho tôi)

Gần nhất tôi đã nhận là một cái gì đó như thế này (không hoàn thành):

find . -maxdepth 1 -d -name "Backup Set*" -print0 | xargs -0 stat -f "%m %N" | sort -r| awk 'NR>5' 

Điều này mang lại cho tôi các thư mục mà tôi muốn xóa, nhưng bây giờ tôi không chắc chắn nếu tôi thoát ra khỏi đường dẫn và đường dẫn đến rm tôi sẽ trở lại tình huống không thể xóa thư mục với không gian trong đó.

đầu ra:

1450241540 ./Backup Set1 
1450241538 ./Backup Set0 

Nhờ sự giúp đỡ ở đây.


bài viết liên quan mà tôi đã xem xét:

https://superuser.com/questions/552600/how-can-i-find-the-oldest-file-in-a-directory-tree

Bash scripting: Deleting the oldest directory

Delete all but the most recent X files in bash

+0

làm 'cái stat 'đầu ra cho phép bạn đặt thêm dấu ngoặc kép, tức là 'stat -f"% m \ "% N \%" "'? Tốt Q, Chúc may mắn. – shellter

Trả lời

3
... | awk 'NR>5' | while read -r timestamp filename; do rm -rf "${filename}"; done 

Khi có nhiều lĩnh vực hơn biến quy định tại read, các remaind er chỉ đơn giản là gộp lại với nhau trong biến được chỉ định cuối cùng. Trong trường hợp của chúng tôi, chúng tôi trích xuất dấu thời gian và sử dụng mọi thứ khác như-là cho tên tệp. Chúng tôi lặp lại đầu ra và chạy một rm cho mỗi mục nhập.

Tôi khuyên bạn nên chạy thử nghiệm với echo thay vì rm để bạn có thể xác minh kết quả trước tiên.


khác, nếu bạn muốn một phiên bản xargs -0:

... | awk 'NR>5' | while read -r timestamp filename; do printf "%s\0" "${filename}"; done | xargs -0 rm -rf 

này cũng sử dụng while read nhưng in mỗi tên tập tin với một delimiter byte null có thể được hấp thụ bởi xargs -0.

+0

Cảm ơn vì điều này, tôi đã thử trước đây và nó hoạt động - với báo trước rằng bạn phải chạy nó từ một kịch bản, tôi đã không thể chạy nó trực tiếp từ dòng lệnh như tôi đã thử nghiệm các lệnh của tôi theo cách này. – skimon

0

đường ống lệnh này cắt cut -d ' ' -f 2- sẽ đưa ra các dấu thời gian

ví dụ đơn giản

echo '1450241538 ./Backup Set0'|cut -d ' ' -f 2- 

sẽ thoát khỏi các timestamps

kết quả sẽ

./Backup Set0 
Các vấn đề liên quan