Điểm:0

Tập lệnh Shell để xóa tất cả các tệp thuộc loại nhất định trong các thư mục khác nhau, ngoại trừ 10 tệp mới nhất

lá cờ eg

Trước hết, xin thứ lỗi cho tiếng Anh kém của tôi.

Tôi đang cố gắng viết một tập lệnh shell để dọn sạch một số tệp thuộc loại nhất định trong các thư mục sao lưu của mình.

Tôi cần xóa các tệp thuộc loại nhất định, ngoại trừ 10 tệp mới nhất trong mỗi thư mục.

Cấu trúc thư mục trông như thế này:

Thư mục gốc
â
âââ thư mục_1
â âââ tệp_1.txt
â âââ tệp_2.txt
â âââ file_n.txt
â
âââ thư mục_2
â âââ tệp_1.txt
â âââ tệp_2.txt
â âââ file_n.txt
â
âââ thư mục_n
â âââ tệp_1.txt
â âââ tệp_2.txt
â âââ file_n.txt
â

Tôi đã sử dụng kịch bản từ David Foster làm cơ sở, nhưng không thể tìm ra cách làm cho nó hoạt động riêng biệt trong các thư mục khác nhau mà không cần viết thủ công từng tên thư mục trong tập lệnh.

Hiện tại, kịch bản trông như thế này:

find /volume1/rootfolder/ -type f -name *.txt -printf '%T@ %p\0' |
sắp xếp --zero-terminated --reverse --numeric-sort --field-separator=' ' --key 1,1 |
trố mắt -F ' ' -v RS='\0' -v ORS='\0' -v keep_count=10 \
  'BEGIN{ maxage = systime() - keep_younger_days * 24 * 3600; }
  (NR > keep_count) && (int($1) < maxage) { print(substr($0, length($1) + 2)); }' |
xargs -r0 -- rm --

Nhưng vấn đề là nó xóa tất cả các tệp trong tất cả các thư mục, ngoại trừ 10 thư mục mới nhất. Vì vậy, về tổng thể, tôi chỉ có 10 tệp trong tất cả các thư mục chứ không phải 10 tệp trong mỗi thư mục.

Vui lòng giúp tôi tìm ra cách tạo tập lệnh để xử lý từng thư mục riêng biệt.

lá cờ hr
Loại điều này dễ dàng hơn trong `zsh`, có vòng loại chung để chọn tệp dựa trên thời gian sửa đổi. Xem ví dụ [Tập lệnh Bash: Xóa các tệp cũ hơn theo điều kiện trong khi vẫn giữ các bản sao mới nhất](https://askubuntu.com/a/1352544/178692) hoặc [Xóa tất cả các tệp trong thư mục cũ hơn mười tệp được thêm gần đây nhất](https: //askubuntu.com/a/930709/178692)
lá cờ ng
Xin lỗi @steeldriver Tôi hy vọng bạn không bận tâm đến câu hỏi - Tôi chỉ đang nghĩ tại sao không viết một tập lệnh Python? Bash đôi khi cảm thấy khó duy trì đối với tôi (ở chỗ tôi đồng ý với việc mở rộng phạm vi cho giải pháp)... theo ý kiến ​​​​cá nhân của bạn thì điều đó có kém phù hợp hơn không, nếu vậy thì tại sao?
lá cờ hr
@brezniczky Ý tôi chỉ là zsh * dễ hơn bash * - Tôi không đủ thông thạo về python để nhận xét về giá trị tương đối của nó
lá cờ ng
@steeldriver được rồi, tôi - gần như rõ ràng - không quen với zsh, dù sao cũng cảm ơn! mong một ngày nào đó ai đó có cả/cả 3 lá bài trong tay sẽ gặp câu hỏi này và cho tôi/chúng tôi câu trả lời :)
Điểm:2
lá cờ cn

Bạn chia thành hai phần. Đầu tiên, bạn xây dựng cấu trúc thư mục, và trong trường hợp này, chúng ta chỉ cần các thư mục chứa tệp. Trong phần thứ hai, chúng tôi sắp xếp tệp mới nhất trước và bỏ qua những tệp có đuôi.

#!/bin/bash

trong khi IFS= read -rd ''; làm
    tìm "$REPLY" \
    -maxdepth 1 -type f -name '*.txt' -printf '%T@\t%p\0' | sắp xếp -zk1rn | cắt -zf2- | đuôi -zn +$((10+1)) | xargs -r -0 echo rm
xong < <( \
    tìm $PWD/dữ liệu \
    -mindepth 2 -type f -printf %h\0 | sắp xếp -zu \
)

Ngoài ra còn có khả năng sử dụng ngôi sao địa cầu với một vòng lặp for:

#!/bin/bash
shopt -s globalstar nullglob

cho một trong dữ liệu/*/**/; làm
    tìm "$a" \
    -maxdepth 1 -type f -name '*.txt' -printf '%T@\t%p\0' | sắp xếp -zk1rn | cắt -zf2- | đuôi -zn +$((10+1)) | xargs -r -0 echo rm
xong

Cuối cùng, chúng tôi sử dụng một loạt các bộ đếm để theo dõi số lượng tệp:

#!/bin/bash

tìm $PWD/data -mindepth 1 -type f -name '*.txt' -printf '%T@\t%p\0' \
    | sắp xếp -zk1rn | cắt -zf2- \
    | awk -F / -vRS='\0' -vORS='\0' '{a=$0; NF=NF-1} b[$0]++ >= 10 {print a}' | xargs -r -0 echo rm
Nazar Tareyev avatar
lá cờ eg
Cảm ơn bạn đã trả lời. Nếu độ sâu thư mục lớn hơn 1 thì sao? Tôi đã đơn giản hóa cấu trúc thư mục của mình chỉ để làm cho câu hỏi của tôi đơn giản hơn. Nhưng cấu trúc thư mục thực sâu hơn và không cố định. Đôi khi các tệp mục tiêu của tôi nằm trong một số thư mục, đôi khi nhiều hơn hoặc ít hơn.
bac0n avatar
lá cờ cn
Tôi đã sử dụng công cụ xác định sai. Bạn có thể thêm `-n 1` vào `xargs` để dễ đọc hơn.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.