Jak mohu použít počítadlo slov (wc
) a pomocí potrubí spočítat, kolik souborů nebo adresářů je v /usr/bin
adresář?
Přijatá odpověď:
Jedním přístupem by bylo použití ls
nám poskytne seznam souborů, ale chceme, aby tento seznam zaručeně zobrazoval pouze 1 soubor nebo adresář na řádek. -1
přepínač to udělá za nás.
$ ls -1
dir1
dir2
dir3
fileA
fileB
fileC
Příklad
Vytvořte výše uvedená ukázková data v prázdném adresáři.
$ mkdir dir{1..3}
$ touch file{A..C}
Zkontrolujte to:
$ ls
dir1 dir2 dir3 fileA fileB fileC
Nyní k počítání můžete použít wc -l
spočítat počet řádků, které odpovídají souboru nebo adresáři v ls -1
výstup.
$ ls -1 | wc -l
6
(Všimněte si však, že nezahrnuje skryté soubory)
Počítání souborů nebo adresářů, jen ne dohromady
Chcete-li počítat soubory nebo adresáře, musíte mírně změnit taktiku. V tomto případě bych použil ls -l
protože ukazuje, co je adresář a co je soubor.
Příklad
$ ls -l
total 12
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Pak můžeme použít grep
pro odfiltrování adresářů nebo ne-adresářů, jako je tento:
# directories
$ ls -l | grep "^d"
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
# regular files
$ ls -l | grep "^-"
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Nyní stačí použít wc -l
znovu počítat výše uvedené:
# directories
$ ls -l | grep "^d" | wc -l
3
# regular files
$ ls -l | grep "^-" | wc -l
3
Můžete se však vyhnout wc
dohromady a použijte grep
‘s -c
možnost:
$ ls -l | grep -c '^d'
(opět nejsou zahrnuty skryté soubory. Všimněte si, že adresáře a regular jsou dva typy souborů. Existuje mnohem více, jako jsou pojmenované kanály, symbolické odkazy, zařízení, zásuvky…).
Rekurze
Pokud potřebujete najít soubory a adresáře rekurzivně pod /usr/bin
pak budete pravděpodobně chtít úplně změnit taktiku a použít jiný nástroj nazvaný find
.
Příklad
$ find /usr/bin | wc -l
4632
(ačkoli nad /usr/bin
sám je zahrnut do počtu)
Stejné techniky, které jsem použil výše, lze použít pomocí ls
udělat něco podobného, ale ls
obecně není dobrým nástrojem pro analýzu výstupu. find
na druhou stranu byl pro toto vytvořen a nabízí přepínače pro vyhledání souborů nebo adresářů.
# find files
$ find /usr/bin -type f
# find directories
$ find /usr/bin -type d
(Všimněte si, že tentokrát find
obsahuje skryté soubory (kromě .
a ..
)).
nové řádky?
Nikdy jsem nepřišel na to, proč je znak nového řádku zákonným znakem, který lze použít při vytváření názvů souborů nebo adresářů. Takže metody popsané výše pomocí wc
a ls
by se s nimi nepotýkal, takže je používejte s ohledem na to.
Příklad
Vytvořte adresář a název souboru s novými řádky.
$ mkdir $'dir4n5'
$ touch $'fileDnE'
ls
zobrazuje je správně:
$ ls -1
dir1
dir2
dir3
dir4?5
fileA
fileB
fileC
fileD?E
Ale wc
počítá adresáře a soubory, které obsahují nové řádky, jako 2 položky, nikoli jako jednu.
$ ls -1 | wc -l
10
Jedna metoda, jak to obejít, pokud používáte GNU implementaci find
je použít find
schopnost vytisknout místo každého nalezeného souboru něco jiného a místo toho je spočítat.
Příklad
$ find . -printf . | wc -c
9
Zde najdeme vše v aktuálním adresáři (kromě ..
) a tisk tečky (.
) pro každý a poté počítání teček pomocí wc
schopnost počítat bajty místo řádků, wc -c
.
Odkazy
- bash – Jaký je nejlepší způsob, jak počítat výsledky hledání?