Xóa các tệp cũ hơn tệp cụ thể


14

Tôi cần xóa khỏi một thư mục tất cả các tệp cũ hơn một tệp cụ thể.
Chạy bash trên CentOS 7.

Tôi có một giải pháp cho việc này, nhưng tôi nghĩ nên có một cách thanh lịch hơn để làm điều đó:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

Câu trả lời:


28

Tôi đã không thử nó, nhưng findsẽ có thể xử lý toàn bộ hoạt động tốt:

$ find dir/ -type f ! -newer reference -delete

... hoặc là...

$ find dir/ -type f ! -newer reference ! -name reference -delete

Về cơ bản:

  • ! -newer referencephù hợp với các tập tin đã được sửa đổi ít hơn gần đây reference.
  • -delete xóa chúng.
  • ! -name referencekhông bao gồm reference, trong trường hợp nó cũng nằm dưới dir/và bạn muốn giữ nó.

Điều này sẽ xóa tất cả các tập tin cũ hơn reference, và nằm dưới dir/.


2
Hoàn hảo :). Chỉ cần thêm -maxdepth 1để giữ cho tìm kiếm không đệ quy
csny

3
! -newercó nghĩa là "không mới hơn", vì vậy "già hơn hoặc cùng tuổi "; bản thân tệp sẽ được khớp nếu nó nằm trong đường dẫn find, chỉ là một điều cần lưu ý.
Ferada

1
@ferada Sẽ không nếu bạn loại trừ nó, đó là lý do tại sao câu trả lời của tôi cũng bao gồm ! -name reference(xem viên đạn thứ ba).
John WH Smith

7

so sánh lần sửa đổi tập tin với test, sử dụng -nt(mới hơn) và -ot(lớn hơn) khai thác:

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi

2
Cảm ơn, điều đó tốt hơn giải pháp của tôi nhưng bạn vẫn cần lặp lại tất cả các tệp trong thư mục và so sánh ... Câu trả lời khác thậm chí còn thanh lịch hơn
csny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.