Elenco dei file in una directory con contenuto delle sottocartelle con ordinamento


9

Sto cercando di elencare l'intero contenuto di una directory, inclusi i contenuti delle sottocartelle ma ordinati per dimensione del file. Finora sono riuscito a raggiungere l'elenco e l'ordinamento pur essendo ricorsivo ls -lhSR( hè bello avere ma sicuramente non essenziale per me, finché riesco a ottenere le dimensioni dei file). Probabilmente sto trascurando qualcosa di ovvio, o chiedendo l'impossibile, ma qualsiasi consiglio qui sarebbe molto apprezzato.

Risposte:


15

Puoi usare trova:

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

Opzionale: per convertire i valori byte in formato leggibile dall'uomo, aggiungere questo:

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

Spiegazione:

 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)

Oh perfetto! Grazie mille, questo ha fatto esattamente quello di cui avevo bisogno!
Tom

3
Sono contento che la mia risposta ti abbia aiutato. Si prega di considerare di fare clic sul segno di spunta sul lato sinistro per contrassegnare la risposta accettata. Grazie.
pLumo,

1
@RoVo sarebbe anche bello votare la domanda poiché, dato che hai risposto, probabilmente l'hai trovata interessante e utile.
terdon,

Questo è davvero vero e l'ho fatto ora ;-)
pLumo

@toms Va bene aspettare un po '(forse un giorno o giù di lì) per accettare la risposta, anche quando è buono come questo. Una volta accettata la risposta, non c'è modo per un'altra risposta di essere ancora migliore. E per questo motivo, molte persone non si preoccuperanno di inviare altre risposte, quindi non abbiamo la possibilità di vederle per scoprire se è meglio.
Monty Harder,

7

Dato che non hai specificato una shell particolare, ecco un'alternativa usando i qualificatori glob di zsh con

setopt extendedglob

per la ricorsione. Quindi ad esempio:

  1. elenca ricorsivamente file semplici:

    printf '%s\n' **/*(.)
  2. ricorsivamente elencare i file semplici, o rdered da in cordonatura L ength (cioè le dimensioni):

    printf '%s\n' **/*(.oL)
  3. Lista ricorsivamente file semplici, O rdered da de dimensioni cordonatura:

    printf '%s\n' **/*(.OL)
  4. elenca ricorsivamente i file semplici, ordinati per dimensione decrescente, e seleziona i primi 3 risultati:

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

Se si desidera anche le dimensioni del file, è possibile utilizzare

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

4

Con l' globstaropzione di shell impostata è possibile utilizzare il globbing della shell:

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

Se lo provi con troppi file, otterrai un errore "Elenco argomenti troppo lungo". Per ovviare a questo, è possibile utilizzare printfe xargs:

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

Ho appena realizzato che stampa anche le directory (con una dimensione di 4096 byte) - se non lo vuoi, usa questo invece:

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

Esempio di esecuzione

$ 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

Bella soluzione. Rispetto a trovare, non include file nascosti, come raggiungerlo?
pLumo,

@RoVo Dimentica sempre questi: devi solo impostare l' dotglobopzione shell, vedi la mia risposta aggiornata.
dessert,

Invece di eliminare le directory dopo il fatto con sed, potresti considerare qualcosa di simileprintf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
steeldriver,

Puoi usarlo ls -lhSd **/*se non ti dispiace avere le directory come parte dell'elenco. O se nessuno dei nomi delle tue directory contiene .e tutti i file che vuoi fare , puoi ll -hS **/*.*o simili.
Peter Cordes,

la trasformò in una risposta
Peter Cordes,

3

Se non hai zsh, puoi comunque usare du+ sort:

  1. Dimensioni leggibili dall'uomo, comprese le dimensioni cumulative delle directory:

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

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

In entrambi i casi, ho scelto di linee null-terminate uso ( -0, -z, -print0opzioni), per essere al sicuro contro tutti i nomi di file validi.


0

Per un rapido uso interattivo su alberi di directory che non sono troppo grandi, shopt -s globstarè davvero bello. Un glob non può filtrare le directory in base al tipo, ma se lo si utilizza con ls -dallora lssarà solo stampare il nome della directory, invece del contenuto.

Supponendo che il tuo llalias includa -lh:

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

ti darà un output come questo (dalla mia directory code-golf), ma con l'evidenziazione del colore (quindi è più facile vedere le directory). Si noti che l'ordinamento per dimensione file è avvenuto in tutte le sottodirectory.

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

È possibile filtrare le directory effettuando il piping grep -v '^d'

A volte puoi usare un glob che corrisponde solo ai file e non alle directory, se i tuoi nomi di file hanno uno schema. per esempio ll -rSd **/*.jpg, o anche **/*.*funziona se nessuno dei nomi delle directory hanno .in loro, e tutti i file che si desidera fare .

(Per le persone con un background DOS: non c'è nulla di magico *.*in Unix. Corrisponde a qualsiasi voce di directory che contiene un punto letterale. Ma a parte i file eseguibili e talvolta i file di testo, è comune dare estensioni ai nomi dei file.)

@dessert sottolinea che è necessario shopt -s dotglobche corrisponda a tutti i file.


Con GNU find

Se non ci sono troppi file per adattarsi a una lsriga di comando, find -exec ls {} +li inserirà tutti nella riga di comando dove lspossono ordinarli.

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

L'utilizzo -not -type danziché -type fevita di ignorare collegamenti simbolici, pipe denominate, socket, file del dispositivo e qualsiasi altra cosa si stia dando in giro nelle directory.


Con 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

Ora i nomi delle directory sono ordinati nell'elenco con la somma totale di tutti i loro contenuti, ma i singoli file sono ancora inclusi.

sort -h, aka --human-numeric-sort, ordina i numeri con suffissi di dimensioni come le du -hstampe. È perfetto per l'uso con du.

Uso spesso du -sch * | sort -ho */per ottenere solo directory.

du -sch **/* | sort -hti darebbe l'output sopra, se dimentichi che duha -aun'opzione.

(Mi sono preso solo il tempo di cercarlo perché sto postando una risposta. Per un uso interattivo, probabilmente avrei usato du -sch **/*.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.