rm60()( IFS=/; set -f; set $(
set +f; \ls -1drt ./*)
while shift &&
[ $# -gt 60 ]
do [ -d "${1%?.}" ] ||
rm "./${1%?.}" || exit
done
)
Điều này sẽ làm việc cho bạn. Nó sẽ xóa các tệp cũ nhất trong thư mục hiện tại lên tới 60. Nó sẽ thực hiện điều này bằng cách phân tích cú pháp ls
mạnh mẽ và nó sẽ thực hiện mà không đưa ra bất kỳ giả định nào về tên tệp của bạn - chúng có thể được đặt tên theo bất kỳ ngày nào và không cần đặt tên theo ngày. Điều này sẽ chỉ hoạt động cho một danh sách của thư mục hiện tại và trong trường hợp bạn đã ls
cài đặt POSIX (và không bị che bởi một số chức năng vỏ xấu, nhưng alias
es được bảo hiểm) .
Giải pháp trên chỉ áp dụng một số phân tách shell rất cơ bản cho một số tên đường dẫn Unix rất cơ bản. Nó đảm bảo ls
liệt kê tất cả các tệp không chấm trong thư mục hiện tại mỗi dòng như sau:
./oldestfile
./second-oldestfile
Bây giờ, bất kỳ một trong số chúng cũng có thể có dòng mới ở giữa, nhưng đó không phải là một vấn đề. Bởi vì trong trường hợp đó, chúng sẽ được liệt kê như sau:
./oldest
file
./s
econd
old
est
file
./third
...và như thế. Và những dòng mới không làm phiền chúng tôi - vì chúng tôi không chia rẽ chúng. Tại sao chúng ta? Chúng tôi đang làm việc với các tên đường dẫn, chúng ta nên phân tách trên dấu phân cách đường dẫn và đó là những gì chúng ta làm:IFS=/
.
Bây giờ làm việc ra một chút lạ. Chúng tôi kết thúc với một danh sách đối số trông như thế này:
<.> <file1\n.> <file2\n.> ... <filelast>
... nhưng điều đó thực sự rất tốt cho chúng tôi, bởi vì chúng tôi có thể trì hoãn các đối số của mình được xử lý bởi shell như các tệp (hoặc, trong trường hợp chúng tôi muốn tránh, các liên kết tượng trưng) cho đến khi chúng tôi khá sẵn sàngrm
chúng.
Vì vậy, một khi chúng tôi đã có danh sách tệp của mình, tất cả những gì chúng tôi phải làm là shift
loại bỏ đối số đầu tiên của chúng tôi, hãy kiểm tra xem chúng tôi hiện có hơn 60 đối số, có thể từ chối rm
thư mục con (mặc dù, tất nhiên, điều đó hoàn toàn phụ thuộc vào bạn) và nếu không thì rm
đối số đầu tiên của chúng tôi ít hơn hai ký tự cuối cùng của nó. Chúng ta không phải lo lắng về lần cuối cùng tranh luận - không có thời gian được nối thêm - bởi vì chúng ta không bao giờ đến đó, và thay vào đó bỏ cuộc ở tuổi 60. Nếu chúng ta đã đi xa đến mức lặp đi lặp lại thì chúng ta chỉ cần thử lại và lặp qua danh sách arg theo cách này cho đến khi chúng tôi cắt tỉa nó để thỏa mãn.
Làm thế nào để phá vỡ? Theo hiểu biết của tôi thì không, nhưng tôi đã cho phép - nếu bất cứ lúc nào xảy ra lỗi không mong muốn thì vòng lặp bị phá vỡ và hàm trả về khác 0.
Và do đó, ls
có thể làm danh sách của bạn cho bạn trong thư mục hiện tại mà không có bất kỳ vấn đề nào cả. Bạn có thể mạnh mẽ cho phép nó sắp xếp các đối số của bạn cho bạn, miễn là bạn có thể phân định chúng một cách đáng tin cậy. Vì lý do đó, nó sẽ không hoạt động như được viết cho bất cứ thứ gì ngoại trừ thư mục hiện tại - nhiều hơn một dấu phân cách trong chuỗi đường dẫn sẽ yêu cầu một mức phân định khác, có thể được thực hiện bằng cách đưa nó ra ngoài gấp đôi cho tất cả trừ trường cuối cùng vào các trường NUL , nhưng tôi không quan tâm để làm điều đó bây giờ.
ls
tùy chọn-lrt
và để tạo danh sách trong vòng lặp for bạn không cầnls
tùy chọn-1
. Mở rộng biến miễn phí ("$dir"
và"$part"
) nên được trích dẫn. Thay vì sử dụng backtics$(ls | wc -l)
.