Điểm:-2

Lấy tổng kích thước của năm tệp lớn nhất của tôi trong bash

lá cờ lr

Tôi đang cố lấy tổng kích thước của năm tệp lớn nhất được tìm thấy trong một thư mục nhưng tôi không nhận được thông tin về danh sách của mình. Tôi có hai cách tìm và sắp xếp, năm tệp lớn nhất.

#!/bin/bash

DIR=$1 #Đường dẫn thư mục bắt đầu


nếu [ ! -d "$DIR" ]; sau đó #nếu thư mục không được tìm thấy
    echo "Thư mục không tồn tại!" 
    thoát 1
fi

echo "Năm tệp lớn nhất sử dụng ls là:"
test_ls=$( ls -lhR "$DIR" | grep '^-' | sort -r -k 5 -h | head -n 5 )
du -ch "$test_ls"


echo "Năm tệp lớn nhất sử dụng find/DU là:"
test_find=$( find "$DIR" -type f -exec du -ch {} + | sort -rh | head -n 5 )
du -ch "$test_find"

echo "Tổng số tập tin: "
ls -lhR "$DIR" | grep '^-' | wc -l
echo "Tổng kích thước của tập tin:"
du -sh "$DIR" | awk '{in $1}'

Nếu tôi áp dụng du trên biến ls, tôi nhận được:

du: tùy chọn không hợp lệ -- 'r'
du: tùy chọn không hợp lệ -- 'w'
du: tùy chọn không hợp lệ -- '-'
du: tùy chọn không hợp lệ -- 'r'

và nếu tôi áp dụng nó trên biến find, tôi sẽ nhận được cái này cho từng tệp trong số năm tệp

du: không thể truy cập '429M': Không có tệp hoặc thư mục như vậy

Cả phiên bản ls và phiên bản find đều hoạt động tốt khi liệt kê năm tệp lớn nhất trong thư mục đã cho, nhưng tôi thực sự không biết làm cách nào để cộng các kích thước của chúng lại với nhau.

lá cờ hr
Nó có phải là bash? Ví dụ, vỏ zsh có thể sắp xếp và chọn tệp theo kích thước trực tiếp. `du -hc **/*(.NDOL[1,5])`
Điểm:1
lá cờ in

Không chắc cách tốt nhất để sửa mã của bạn, tôi sẽ đề xuất một cách tiếp cận khác mà không cần du như tìm thấy có thể trả lại kích thước tệp với -printf '%s'.

Cũng lưu ý rằng bạn không bao giờ nên phân tích cú pháp ls và đó tìm thấy không giống ls sẽ chạy đệ quy nếu bạn không giới hạn điều đó với -độ sâu tối đa Tùy chọn.


Điều này sẽ tìm thấy năm tệp lớn nhất trong một thư mục và tính tổng kích thước của nó:

tìm "$DIR" -maxdepth 1 -type f -printf '%s\n' | sắp xếp -nr | đầu -n5 | dán -sd+ | bc | numfmt --to=iec
  • tìm ... -printf '%s\n' sẽ in kích thước tệp theo byte
  • | sắp xếp -nr | đầu -n5 sẽ tìm được năm số lớn nhất
  • | dán -sd+ sẽ nối các số có dấu cộng ở giữa chúng, vì vậy đó là một biểu thức toán học
  • | bc sẽ chạy biểu thức toán học
  • | numfmt --to=iec (tùy chọn) sẽ chuyển đổi kích thước từ byte sang định dạng con người có thể đọc được.

Để có thêm thông tin, bạn có thể lưu tìm thấy đầu ra, ví dụ: trong một mảng:

TRỰC TIẾP =/một số/thư mục
file_sizes=($(find "$DIR" -maxdepth 1 -type f -printf '%s\n' | sort -nr))

num_files=${#file_sizes[@]}
total_size=$(IFS=+; echo "$((${file_sizes[*]}))" | numfmt --to=iec)
big_files=$(IFS=+; echo "$((${file_sizes[*]:0:5}))" | numfmt --to=iec)

printf 'Tổng số tệp: %d\nTổng kích thước tệp: %s\nKích thước của 5 tệp lớn nhất: %s\n' $num_files $total_size $biggest_files

Đă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.