GNU/Linux >> Znalost Linux >  >> Linux

Výpis počtu souborů v každé složce Kde název složky odpovídá vzoru?

Chtěl bych rekurzivně prohledat adresářový strom a vypsat počet souborů dostupných v každé složce, které mají název odpovídající danému řetězci. Ve skutečnosti bych chtěl vrátit výsledky:

ls -l | wc -l

pro každou složku, kterou jsem identifikoval pomocí find .

Kód

Níže uvedený kód správně uvádí počet souborů v každé složce, jejíž název obsahuje Magic Data řetězec.

find /path/to/cool/stuff                                 
        -maxdepth 4                                      
        -type d                                          
        -name '*Magic Data*'                             
        -print0 | xargs                                  
                --verbose                                
                -0 -I {} ls -l {}               

Chtěl bych to rozšířit a zpracovat výsledky ls na wc -l .

Pokus

find /path/to/cool/stuff                                 
        -maxdepth 4                                      
        -type d                                          
        -name '*Magic Data*'                             
        -print0 | xargs                                  
                --verbose                                
                -0 -I {} ls -l {}  | wc -l            

Toto selže a vytiskne se:

ls -l /path/to/cool/stuff/some/folders/Magic Data
ls -l /path/to/cool/stuff/some/folders2/Magic Data

Požadovaný výstup

/path/to/cool/stuff/some/folders/Magic Data  29
/path/to/cool/stuff/some/folders2/Magic Data 30

Požadovaný výstup by obsahoval:

  • Úplná cesta k prohledávané složce
  • Výstup wc -l , což v tomto případě odráží počet neskrytých souborů

Přijatá odpověď:

Existují dva hlavní způsoby, jak to vyřešit:

  1. Upravte find příkaz tak, že zadá pouze adresáře, které vás zajímají, a poté vytiskne jeden znak (např. x ) pro každý nalezený soubor v. Poté spočítejte počet vytvořených znaků pomocí wc -l . Je bezpečnější vypsat znak než název cesty, protože názvy cest v Unixu mohou potenciálně obsahovat nové řádky. Toto řešení je trochu složitější, protože zahrnuje použití -prune ignorovat adresáře, které nás nezajímají, nebo alternativně ! -path .

  2. Najděte adresáře stejně jako doposud, ale pak použijte in-line skript k počítání souborů v nich. Toto je jednodušší a to, co uvádím níže.

find /path/to/cool/stuff -maxdepth 4 -type d -name "*Magic Data*' 
    -exec bash -O dotglob -c '
        dir=$1
        set -- "$dir"/*
        printf "%s %dn" "$dir" "$#"' bash {} ';'

Zde najdeme adresáře jako vy, pak pro každý adresář spustíme tento krátký bash skript:

dir=$1
set -- "$dir"/*
printf "%s %dn" "$dir" "$#"

Toto převezme cestu k adresáři z příkazového řádku (zadané pomocí find ) a rozšíří * glob vzor v něm. Nastavením dotglob shell na příkazovém řádku skriptu, garantujeme také počítat skryté soubory a adresáře (odstranit -O dotglob aby se nepočítala skrytá jména).

Související:Jak povolit přístup k zařízením USB v rámci hostů VirtualBoxu?

Provádíme rozšíření všech jmen jako argument na set , který nastaví poziční parametry na rozšířené položky. Počet pozičních parametrů je k dispozici jako $# , což je tedy také počet souborů v tomto konkrétním adresáři.

Související:

  • Pochopení volby -exec funkce `find`

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

  2. Jak vytisknout název chybějících souborů ve složce?

  3. Jaký je nejlepší způsob, jak spočítat počet souborů v adresáři?

  1. Jak vyhledávat v konkrétních souborech odpovídajících vzoru?

  2. Přeformátování velkého počtu souborů XML?

  3. Počítat počet souborů ve složce za den?

  1. najít soubory, které mají číslo v názvu souboru větší než

  2. Počítání počtu souborů v adresáři pomocí příkazu terminálu OSX

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