GNU/Linux >> Znalost Linux >  >> Linux

Najděte adresáře obsahující určitý počet souborů

Můžete zkusit toto, abyste získali názvy podadresářů a počet souborů/adresářů, které obsahují:

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

Pokud chcete udělat totéž pro všechny podadresáře (rekurzivní hledání), použijte místo toho toto:

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

Chcete-li vybrat ty adresáře, které mají přesně 10 souborů:

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

10 nebo více:

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

10 nebo méně:

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

Pokud si chcete ponechat pouze název adresáře (např. chcete-li jej přesměrovat do jiného procesu po proudu, jak navrhuje @evilsoup), můžete použít toto:

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

Chcete-li zobrazit okamžité podadresáře obsahující přesně $NUM soubory.

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}'

Chcete-li zobrazit okamžité podadresáře obsahující větší než $NUM soubory.

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}'

Chcete-li zobrazit okamžité podadresáře obsahující méně než $NUM soubory.

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}'

Položky jsou ukončeny prázdným znakem \0 , takže názvy souborů, které obsahují nové řádky nebo jiné typy mezer, budou správně interpretovány. %h vytiskne dirname každého souboru . awk pak pomocí pole spočítá, kolikrát narazí na každý adresář, a vytiskne jej, pokud jsou splněny podmínky.

Vezměte prosím na vědomí, že žádný z výše uvedených příkazů nezobrazí adresáře obsahující nula souborů. Všimněte si také, že souborem mám na mysli běžné soubory, ne odkazy, adresáře, zásuvky, bloky, pojmenované kanály atd.

Snažil jsem se to udělat co nejjednodušeji. Pokud chcete najít rekurzivní podadresáře nebo soubory v nich, je vyžadován upravený příkaz. Existuje příliš mnoho možností, než je všechny vyjmenovat.


Zkuste toto:

['najít. | wc -l` -eq 10 ] &&echo "Nalezeno"

['najít. | wc -l` -gt 10 ] &&echo "Nalezeno"

['najít. | wc -l` -lt 10 ] &&echo "Nalezeno"

V těchto příkladech můžete zkontrolovat, zda AKTUÁLNÍ adresář obsahuje přesně 10, více než 10 a méně než 10 souborů/adresářů. Pokud potřebujete zkontrolovat spoustu adresářů, použijte smyčku.


Linux
  1. Jak zjistit počet souborů v adresáři a podadresářích

  2. Najděte soubory a adresáře v Linuxu jako profík

  3. Jak pomocí WC a potrubí zjistit, kolik souborů a adresářů je v určitém adresáři?

  1. Maximální počet souborů/adresářů na Linuxu?

  2. Najděte všechny soubory s názvem obsahujícím řetězec

  3. Jak najít největší adresáře nebo největší soubory?

  1. Najděte největší soubory a adresáře v Linuxu

  2. du, který počítá spíše počet souborů/adresářů než velikost

  3. Rychlejší způsob, jak odstranit velké množství souborů