Liệt kê các tệp trong một thư mục bao gồm nội dung của các thư mục con với sắp xếp


9

Tôi đang tìm cách liệt kê toàn bộ nội dung của một thư mục, bao gồm nội dung của các thư mục con nhưng được sắp xếp theo kích thước tệp. Cho đến nay tôi đã xoay sở để có được danh sách và sắp xếp trong khi vẫn đang được đệ quy ls -lhSR(điều hnày là tốt nhưng chắc chắn không cần thiết cho tôi, miễn là tôi có thể nhận được kích thước tệp). Tôi có khả năng nhìn ra một cái gì đó rõ ràng, hoặc hỏi những điều không thể, nhưng bất kỳ lời khuyên nào ở đây sẽ được đánh giá rất cao.

Câu trả lời:


15

Bạn có thể sử dụng tìm:

find . -type f -printf "%s %P\n" | sort -n

Tùy chọn: Để chuyển đổi giá trị byte thành định dạng có thể đọc được, hãy thêm:

| numfmt --to=iec-i --field=1

Giải trình:

 find in current directory (.) all files (-type f) 

 -printf: suppress normal output and print the following:
     %s - size in bytes
     %P - path to file
     \n - new line

 | sort -n: sort the result (-n = numeric)

Ôi tuyệt vời! Cảm ơn bạn rất nhiều, điều này đã làm chính xác những gì tôi cần!
toms

3
Tôi rất vui vì câu trả lời của tôi đã giúp bạn. Vui lòng xem xét nhấp vào dấu kiểm ở phía bên trái để đánh dấu câu trả lời được chấp nhận. Cảm ơn.
pLumo

1
@RoVo cũng thật tuyệt khi nêu lên câu hỏi vì cho rằng bạn đã trả lời nó, có lẽ bạn thấy nó thú vị và hữu ích.
terdon

Điều này thực sự đúng và tôi đã làm điều này ngay bây giờ ;-)
pLumo

@toms Bạn có thể đợi một lúc (có thể một ngày hoặc lâu hơn) để chấp nhận câu trả lời, ngay cả khi nó tốt như thế này. Một khi câu trả lời được chấp nhận, không có cách nào để câu trả lời khác trở nên tốt hơn nữa. Và vì lý do đó, rất nhiều người sẽ không muốn gửi bất kỳ câu trả lời nào khác, vì vậy chúng tôi không có cơ hội gặp họ để tìm hiểu xem ai tốt hơn.
Monty Harder

7

Vì bạn không chỉ định một vỏ cụ thể, đây là một thay thế sử dụng vòng loại toàn cầu của zsh với

setopt extendedglob

cho đệ quy. Sau đó, ví dụ:

  1. liệt kê đệ quy các tệp đơn giản:

    printf '%s\n' **/*(.)
  2. đệ quy liệt kê các file đơn giản, o rdered bởi trong nhăn L ength (tức là kích thước):

    printf '%s\n' **/*(.oL)
  3. danh sách đệ quy file đơn giản, O rdered bởi de kích thước nhăn:

    printf '%s\n' **/*(.OL)
  4. liệt kê đệ quy các tệp đơn giản, được sắp xếp theo kích thước giảm và chọn 3 kết quả hàng đầu:

    printf '%s\n' **/*(.OL[1,3])

Nếu bạn muốn kích thước tập tin là tốt, sau đó bạn có thể sử dụng

du -hb **/*(.OL[1,3])

4

Với globstartùy chọn shell, bạn có thể sử dụng shell globalbing:

shopt -s globstar         # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n

Nếu bạn thử làm điều đó với quá nhiều tệp, bạn sẽ nhận được một danh sách đối số lỗi quá dài. Để khắc phục điều đó, bạn có thể sử dụng printfxargs:

printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n

Tôi cũng nhận ra điều này in các thư mục (với kích thước 4096 byte) - nếu bạn không muốn điều đó, thay vào đó hãy sử dụng thư mục này:

stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n

Chạy ví dụ

$ tree
.
├── edits.png
├── makescript
├── new
   └── edits.png
└── test
    └── 1.png

2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png

Giải pháp tốt đẹp. So với tìm, nó không bao gồm các tập tin ẩn, làm thế nào để đạt được điều đó?
pLumo

@RoVo Luôn quên những điều này - bạn chỉ cần đặt dotglobtùy chọn shell, xem câu trả lời cập nhật của tôi.
tráng miệng

Thay vì tước các thư mục sau khi thực tế với sed, bạn có thể xem xét một cái gì đó nhưprintf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
Steeldo

Bạn có thể sử dụng ls -lhSd **/*nếu bạn không có các thư mục là một phần của danh sách. Hoặc nếu không có tên thư mục nào của bạn có .trong đó và tất cả các tệp bạn muốn làm , bạn có thể ll -hS **/*.*hoặc tương tự.
Peter Cordes

biến điều đó thành một câu trả lời
Peter Cordes

3

Nếu bạn không có zsh, bạn vẫn có thể sử dụng du+ sort:

  1. Kích thước có thể đọc được của con người, bao gồm kích thước tích lũy của các thư mục:

    du --apparent-size -ah0 . | sort -zh | xargs -0L1
    
  2. Chỉ các tệp (sử dụng find):

    find . -type f -print0 |
      du --files0-from=- --apparent-size -ah0 |
      sort -zh |
      xargs -0L1
    

Trong cả hai trường hợp, tôi đã chọn để sử dụng dòng null-chấm dứt ( -0, -z, -print0tùy chọn), để được an toàn chống lại tất cả tên tập tin hợp lệ.


0

Để sử dụng tương tác nhanh chóng trên các cây thư mục không quá lớn, shopt -s globstarthực sự tốt. Toàn cầu không thể lọc các thư mục dựa trên loại, nhưng nếu bạn sử dụng nó ls -dthì lssẽ chỉ in tên thư mục, thay vì nội dung.

Giả sử llbí danh của bạn bao gồm -lh:

  # with  shopt -s globstar   in your .bashrc
ll -rSd **/*

sẽ cung cấp cho bạn đầu ra như thế này (từ thư mục golf-code của tôi), nhưng với tô sáng màu (để dễ dàng xem các thư mục hơn). Lưu ý rằng sắp xếp theo kích thước tệp đã xảy ra trên các thư mục con.

drwxr-xr-x 1 peter peter   70 Jun  8 07:56 casexchg
...
drwxr-xr-x 1 peter peter  342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter  387 Jul 29  2017 likely.cpp
-rw-r--r-- 1 peter peter  416 Aug 31  2017 true-binary.asm~
-rw-r--r-- 1 peter peter  447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun  1  2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31  2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17  2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24  2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25  2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26  2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb  6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25  2017 fibonacci/fibonacci-1G-performance.asm~
...

Bạn có thể lọc các thư mục bằng cách chuyển qua grep -v '^d'

Đôi khi bạn có thể sử dụng một quả cầu chỉ khớp với các tệp và không phải thư mục, nếu tên tệp của bạn có mẫu. ví dụ ll -rSd **/*.jpg, hoặc thậm chí **/*.*hoạt động nếu không có tên thư mục nào của bạn có .trong đó và tất cả các tệp bạn muốn làm .

(Đối với những người có nền tảng DOS: không có gì kỳ diệu về *.*Unix. Nó chỉ phù hợp với bất kỳ mục nhập thư mục nào có chứa một dấu chấm bằng chữ.

@d PLAY chỉ ra rằng bạn sẽ cần shopt -s dotglobnó để khớp với tất cả các tệp.


Với GNU find

Nếu không có quá nhiều tệp phù hợp với một lsdòng lệnh, find -exec ls {} +sẽ đặt tất cả chúng vào dòng lệnh nơi lscó thể sắp xếp chúng.

find -not -type d -exec ls --color -lrSh {} +

Sử dụng -not -type dthay vì -type ftránh bỏ qua các liên kết tượng trưng, ​​đường ống được đặt tên, ổ cắm, tệp thiết bị và bất cứ thứ gì khác mà bạn có trong thư mục của mình.


Với du:

du -ach | sort -h
....
4.0K    x86-modedetect-polyglot.o
8.0K    ascii-compress-base.asm
8.0K    dizzy-integer
8.0K    stopwatch-rdtsc.asm
8.0K    string-exponential.asm
8.0K    true-binary
12K     a.out
12K     bubblesort.asm
12K     casexchg
12K     empty-args
100K    parity-party
220K    fibonacci
628K    total

Bây giờ tên thư mục được sắp xếp vào danh sách để tổng cộng tất cả nội dung của chúng, nhưng các tệp riêng lẻ vẫn được bao gồm.

sort -h, aka --human-numeric-sort, sắp xếp các số có hậu tố kích thước như du -hin. Nó hoàn hảo để sử dụng với du.

Tôi thường sử dụng du -sch * | sort -h, hoặc */để chỉ nhận các thư mục.

du -sch **/* | sort -hsẽ cung cấp cho bạn đầu ra ở trên, nếu bạn quên rằng ducó một -atùy chọn.

(Tôi chỉ dành thời gian để tra cứu vì tôi đang đăng câu trả lời. Để sử dụng tương tác, có lẽ tôi sẽ chỉ sử dụng du -sch **/*.

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.