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:
-
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
. -
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).
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`