Mendaftar file dalam direktori termasuk konten subfolder dengan penyortiran

9

Saya mencari daftar seluruh isi direktori, termasuk isi dari subfolder tetapi diurutkan berdasarkan filesize. Sejauh ini saya sudah berhasil mendapatkan daftar dan pemilahan sementara masih bersifat rekursif ls -lhSR( hbagus untuk dimiliki tetapi jelas tidak penting bagi saya, selama saya bisa mendapatkan ukuran file). Saya cenderung mengabaikan sesuatu yang jelas, atau meminta yang tidak mungkin, tetapi saran apa pun di sini akan sangat dihargai.

tom
sumber

Jawaban:

15

Anda dapat menggunakan find:

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

Opsional: Untuk mengonversi nilai byte ke format yang dapat dibaca manusia, tambahkan ini:

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

Penjelasan:

 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)
pLumo
sumber
Oh sempurna! Terima kasih banyak, ini tepat seperti yang saya butuhkan!
Tom
3
Saya senang jawaban saya membantu Anda. Harap pertimbangkan mengklik tanda centang di sebelah kiri untuk menandai jawaban yang diterima. Terima kasih.
pLumo
1
@RoVo juga akan menyenangkan untuk menjawab pertanyaan karena, karena Anda telah menjawabnya, Anda mungkin menganggapnya menarik dan bermanfaat.
terdon
Ini memang benar dan saya melakukan ini sekarang ;-)
pLumo
@ Tom Tidak apa-apa untuk menunggu sebentar (mungkin sehari atau lebih) untuk menerima jawabannya, bahkan ketika itu sama baiknya dengan yang ini. Setelah jawaban diterima, tidak ada cara untuk jawaban lain menjadi lebih baik. Dan karena itu, banyak orang tidak akan repot-repot mengirimkan jawaban lain, jadi kami tidak mendapatkan kesempatan untuk melihat mereka untuk mengetahui apakah ada yang lebih baik.
Monty Harder
7

Karena Anda tidak menentukan shell tertentu, inilah alternatif menggunakan kualifikasi glob zsh dengan

setopt extendedglob

untuk rekursi. Lalu misalnya:

  1. daftar file biasa secara rekursif:

    printf '%s\n' **/*(.)
  2. rekursif daftar file polos, o rdered oleh di kekusutan L ength (yaitu ukuran):

    printf '%s\n' **/*(.oL)
  3. daftar file biasa secara rekursif, O rdered oleh de creasing ukuran:

    printf '%s\n' **/*(.OL)
  4. daftar file biasa secara rekursif, dipesan dengan ukuran yang dikurangi, dan pilih 3 hasil teratas:

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

Jika Anda menginginkan ukuran file juga, maka Anda bisa menggunakannya

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

Dengan globstaropsi shell, Anda dapat menggunakan shell globbing:

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

Jika Anda mencobanya dengan terlalu banyak file, Anda akan mendapatkan kesalahan "Daftar argumen terlalu panjang". Untuk mengatasinya, Anda dapat menggunakan printfdan xargs:

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

Saya baru menyadari ini mencetak direktori (dengan ukuran 4096 byte) juga - jika Anda tidak menginginkannya, gunakan ini sebagai gantinya:

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

Contoh dijalankan

$ 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
pencuci mulut
sumber
Solusi yang bagus. Dibandingkan menemukan, itu tidak termasuk file tersembunyi, bagaimana mencapainya?
pLumo
@RoVo Selalu lupakan ini - Anda hanya perlu mengatur dotglobopsi shell, lihat jawaban saya yang diperbarui.
hidangan penutup
Alih-alih menelanjangi direktori setelah fakta dengan sed, Anda dapat mempertimbangkan sesuatu sepertiprintf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
steeldriver
Anda dapat menggunakan ls -lhSd **/*jika Anda tidak keberatan memiliki direktori sebagai bagian dari daftar. Atau jika tidak ada nama direktori Anda .di dalamnya, dan semua file yang ingin Anda lakukan , Anda bisa ll -hS **/*.*, atau serupa.
Peter Cordes
mengubahnya menjadi jawaban
Peter Cordes
3

Jika Anda tidak memiliki zsh, Anda masih dapat menggunakan du+ sort:

  1. Ukuran yang dapat dibaca manusia, termasuk ukuran kumulatif direktori:

    du --apparent-size -ah0 . | sort -zh | xargs -0L1
    
  2. Hanya file (menggunakan find):

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

Dalam kedua kasus, saya telah memilih untuk menggunakan garis nol-dihentikan ( -0, -z, -print0pilihan), aman terhadap semua nama file yang valid.

muru
sumber
0

Untuk penggunaan interaktif cepat pada pohon direktori yang tidak terlalu besar, shopt -s globstarsangat bagus. Sebuah gumpal tidak dapat menyaring direktori berdasarkan jenis, tetapi jika Anda menggunakannya dengan ls -dkemudian lshanya akan mencetak nama direktori, bukan isi.

Dengan asumsi llalias Anda termasuk -lh:

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

akan memberi Anda output seperti ini (dari direktori kode-golf saya), tetapi dengan penyorotan warna (sehingga lebih mudah untuk melihat direktori). Perhatikan bahwa penyortiran menurut ukuran file terjadi di seluruh subdirektori.

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~
...

Anda dapat memfilter direktori dengan menyalurkan melalui grep -v '^d'

Terkadang Anda dapat menggunakan gumpalan yang hanya cocok dengan file dan bukan direktori, jika nama file Anda memiliki pola. misalnya ll -rSd **/*.jpg, atau bahkan **/*.*berfungsi jika tidak ada nama direktori Anda .di dalamnya, dan semua file yang ingin Anda lakukan .

(Untuk orang-orang dengan latar belakang DOS: tidak ada yang ajaib *.*di Unix. Itu hanya cocok dengan entri direktori yang mengandung titik literal. Tetapi selain file executable dan terkadang file teks, adalah umum untuk memberikan ekstensi ke nama file.)

@dihkan menunjukkan Anda akan perlu shopt -s dotglobuntuk mencocokkan semua file.


Dengan GNU find

Jika tidak ada terlalu banyak file untuk dipasangkan pada satu lsbaris perintah, find -exec ls {} +akan meletakkan semuanya pada baris perintah di mana lsdapat mengurutkannya.

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

Menggunakan -not -type dalih-alih -type fmenghindari mengabaikan symlink, bernama pipa, soket, file perangkat, dan apa pun yang Anda temukan di direktori Anda.


Dengan 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

Sekarang nama direktori disortir ke dalam daftar dengan menjumlahkan semua kontennya, tetapi masing-masing file masih disertakan.

sort -h, alias --human-numeric-sort, mengurutkan angka dengan sufiks ukuran seperti du -hcetakan. Ini sempurna untuk digunakan bersama du.

Saya sering menggunakan du -sch * | sort -h, atau */hanya mendapatkan direktori.

du -sch **/* | sort -hakan memberi Anda output di atas, jika Anda lupa bahwa dumemiliki -aopsi.

(Saya hanya meluangkan waktu untuk mencarinya karena saya memposting jawaban. Untuk penggunaan interaktif, saya mungkin hanya akan menggunakan du -sch **/*.

Peter Cordes
sumber