Tìm tệp đệ quy lớn nhất


41

Tôi đang cố gắng tìm tập tin lớn nhất trong một thư mục đệ quy. Nếu có thư mục con bên trong thư mục đó, hàm cần vào bên trong thư mục đó và kiểm tra xem tệp lớn nhất có ở đó không. Khi tìm thấy tệp lớn nhất, đầu ra được hiển thị với tên đường dẫn tương đối và tên và kích thước của tệp lớn nhất.

VÍ DỤ:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

Đây là những gì tôi có:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

Tôi đã bị mắc kẹt trong một thời gian. Tôi không thể thực hiện điều này bằng cách sắp xếp một số công cụ Unix hiện có. Bất kỳ ý tưởng sẽ được tốt đẹp!



chỉ đi trong các thư mục con : for d in */ .[^.]*/; làm ... `
Olivier Dulac

Câu trả lời:


54

sử dụng find(ở đây giả sử GNU find) để xuất tên tệp với kích thước tệp. Sắp xếp. in ra cái lớn nhất

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

Giả sử đường dẫn tệp không chứa ký tự dòng mới.


Sử dụng một vòng lặp bashvới việc triển khai GNU của stat:

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

Điều này sẽ chậm hơn đáng kể so với giải pháp tìm kiếm. Điều đó cũng giả sử rằng tên tệp không kết thúc bằng ký tự dòng mới và sẽ bỏ qua các tệp bị ẩn và không đi vào các thư mục ẩn.

Nếu có một tệp được gọi -trong thư mục hiện tại, kích thước của tệp mở trên stdin sẽ được xem xét.

Coi chừng các phiên bản bashtrước 4.3 theo các liên kết tượng trưng khi hạ xuống cây thư mục.


Cảm ơn, nó hoạt động! Tôi đánh giá cao sự giúp đỡ. Tôi đang cố gắng để sử dụng để lập trình trong shell. Tôi không biết rất nhiều ngay bây giờ vì vậy tôi đánh giá cao bạn nói cho tôi biết những gì đang xảy ra với dòng mã đó.
dùng2419571

Câu hỏi nhanh: Vì tò mò có cách nào để làm điều đó mà không cần các lệnh đường ống? Tôi tò mò bởi vì mọi ví dụ tôi đã thấy đã sử dụng một số loại đường ống.
dùng2419571

2
Tôi chắc chắn có nhiều cách khác để làm điều đó. Triết lý của UNIX là các công cụ nên là một mục đích duy nhất và để xâu chuỗi chúng lại với nhau để đầu ra của một lệnh được đưa vào đầu vào của lệnh tiếp theo.
glenn jackman

Điều đó có ý nghĩa. Cảm ơn lần nữa vì sự giúp đỡ của bạn.
dùng2419571

2
@ user2419571 : tail -n 1 <(sort -n <(find . -type f -printf "%s\t%p\n"));)
Cyrus

9

Lệnh này cũng giúp liệt kê ra kích thước được xác định.

find . -type f -size +100M -exec ls -lh {} \;

5

Điều này hoạt động trên BSD / macOS:

find . -type f -ls | sort -k7 -r

Bạn cũng có thể nối thêm | head -n 3để hiển thị số mục nhập thú vị (3 trong trường hợp này).


1
Câu trả lời này có thể được cải thiện bằng cách giải thích cách thức hoạt động của nó. Ngoài ra, nó trông rất giống với câu trả lời được chấp nhận (không giải thích đầy đủ về cách thức hoạt động của nó).
dhag

man findman sort, sử dụng brainz :-)
CeDeROM

Không thực sự hoạt động trên MacOS vì nó không trả về kích thước chính xác và trả về một số lượng lớn các cột.
sorin

3

Với zsh, đối với tệp thường xuyên lớn nhất:

ls -ld -- **/*(.DOL[1])

(tất nhiên bạn có thể thay thế ls -ld --bằng bất kỳ lệnh nào. Nếu sử dụng GNU lshoặc tương thích, hãy xem -htùy chọn cho kích thước có thể đọc được của con người )

  • .: chỉ các tệp thông thường (không phải thư mục, liên kết tượng trưng, ​​thiết bị, fifos ...)
  • D: bao gồm những người ẩn và đi xuống các thư mục ẩn
  • OL: sắp xếp ngược theo kích thước ( Length).
  • [1]: chỉ trận đấu đầu tiên.

Nếu có mối quan hệ, bạn sẽ nhận được bất kỳ một trong số họ một cách ngẫu nhiên. Nếu bạn muốn đầu tiên theo thứ tự bảng chữ cái, hãy thêm một on( order by name) để sắp xếp các mối quan hệ theo thứ tự abc.

Lưu ý rằng nó xem xét kích thước tập tin, không sử dụng đĩa.


... Tôi bắt đầu tin rằng bạn đang ở trong bảng lương của zsh;) (điều đó rất tốt có thể xảy ra?). Rất tiếc, zsh không có sẵn trên tất cả các hệ thống ...
Olivier Dulac

Có thể có được mười tập tin đầu tiên? (Không làm điều gì đó ngu ngốc như một vòng lặp)
Wowfunhappy

1
@Wowfunhappy thay thế [1]bằng[1,10]
Stéphane Chazelas
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.