GNU/Linux >> Linux Esercitazione >  >> Linux

Trova directory contenenti un certo numero di file

Puoi provare questo, per ottenere i nomi delle sottodirectory e il numero di file/directory che contengono:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

Se vuoi fare lo stesso per tutte le sottodirectory (ricerca ricorsiva) usa invece questo:

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

Per selezionare quelle directory che hanno esattamente 10 file:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'

10 o più:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF>=10'

10 o meno:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF<=10'

Se vuoi mantenere solo il nome della directory (ad esempio se vuoi reindirizzarlo a un altro processo a valle come suggerito da @evilsoup) puoi usare questo:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; | 
 awk -F"\t" '$NF<=10{print $1}'

Per elencare le sottodirectory immediate contenenti esattamente $NUM file.

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'

Per elencare le sottodirectory immediate contenenti maggiore di $NUM file.

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'

Per elencare le sottodirectory immediate contenenti less di $NUM file.

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'

Gli elementi sono terminati da un carattere nullo \0 , quindi i nomi di file che contengono newline o altri tipi di spazio vuoto verranno interpretati correttamente. Il %h stampa il dirname di ciascun file . awk quindi utilizza un array per contare quante volte incontra ogni directory, stampandolo se le condizioni sono soddisfatte.

Si noti che nessuno dei suddetti comandi visualizzerà directory contenenti zero file. Nota anche che per file mi riferisco a file regolari, non link, directory, socket, blocchi, named pipe, eccetera.

Ho cercato di farlo nel modo più semplice possibile. Se vuoi trovare sottodirectory ricorsive oi file in esse contenuti, è necessario un comando modificato. Ci sono troppe possibilità per elencarle tutte.


Prova questo:

[ `trova . | wc -l` -eq 10 ] &&echo "Trovato"

[ `trova . | wc -l` -gt 10 ] &&echo "Trovato"

[ `trova . | wc -l` -lt 10 ] &&echo "Trovato"

In questi esempi puoi verificare se la directory CURRENT contiene esattamente 10, più di 10 e meno di 10 file/directory. Se hai bisogno di controllare un mucchio di directory, usa semplicemente loop.


Linux
  1. Come trovare il numero di file in una directory e sottodirectory

  2. Trova file e directory in Linux come un professionista

  3. Trova i file e le directory più grandi in Linux

  4. Come trovare ed eliminare directory e file vuoti in Unix

  5. Numero massimo di file/directory su Linux?

Trova comando in Linux (Trova file e directory)

3 modi per trovare file e directory in Linux

Trova facilmente file e directory su Linux

Numero di file contenenti una determinata stringa?

Linux:trova il numero di file in una directory e sottodirectory

Modo più veloce per eliminare un gran numero di file