Jak spočítat soubory v adresáři
Mám okno, nevím efektivnější způsob než for s in * ...
ls . |wc -l nefunguje, když se soubor jmenuje "a\nb"
Mám okno, nevím efektivnější způsob než for s in * ...
ls . |wc -l nefunguje, když se soubor jmenuje "a\nb"
Do testu, i praktického, lze využít ls
a wc
, soubory obsahující v názvu nový řádek neuvažujeme. Kdybychom chtěli opravdu kompletní řešení, které si poradí i s novým řádkem, tak for
je možná cesta, další je find
s vhodným -printf
nebo -exec
, ještě další je stat
s vhodným -c
- to bude asi vůbec nejjednodušší, něco jako stat -c "%i" * .* | wc -l
Případně je možné využít tak trochu „hack“ a nastavit quoting style:
ls --quoting-style=c | wc -l
Pak se nový řádek escapuje jako v Céčku. Ale to je jen tak pro zajímavost (kdyby to někdo skutečně potřeboval), do testu z PS1 se to nemá smysl učit.
Díky, tak to funguje. Bohužel ls na Solarisu to neumí. Navíc dle zájmu předmětu PS1 beru Pepovu odpověď jako přednější.
VojtechMyslivec ( 2014-11-06 22:59:02 +0100 )editmyslím, že to co hledáš je ls -l | wc -l
EDIT:
pokud chceš čistě jenom soubory, bez adresářů, linků atd
tak zkus ls -la | grep "^-" | wc -l
Špatně. `ls -l` vypíše také řádek s celkovou velikostí souborů. Navíc nevypíše skryté soubory.
Josef Kokeš ( 2014-11-06 18:49:06 +0100 )editNavíc otázka zněla, že tohle nefunguje, když se soubor jmenuje A\nB Jméno jednoho souboru je pak na dva řádky. Příklad s grepem: nepřítel pojmenuje soubor "A\n-" Grep si pak myslí, že je to další soubor ;)
VojtechMyslivec ( 2014-11-06 18:52:37 +0100 )editV době, kdy jsem to psal, ještě grep použit nebyl. Plus, pokud je otázka "spočítat soubory", tak sice můžeme diskutovat o tom, jestli se mají počítat třeba adresáře, ale není nejmenších pochyb o tom, že skryté soubory ze započítání vyloučeny nejsou.
Josef Kokeš ( 2014-11-06 18:58:07 +0100 )editAsked: 2014-11-06 18:27:53 +0100
Seen: 330 times
Last updated: Nov 14 '14
Aby bylo jasno: \n zde myslím opravdu znak nového řádku, ne "backslash n". Poznámka: Na Linuxu to celkem funguje bez zvláštních opatření. ls je celkem "chytrý" (podle toho, co tedy očekávám). Mě ukazuje soubor "a?b" (gnu ls 8.13). U Petra Hodače jsem viděl přímo "a\nb". Stejné chování se u mě zajistí přepínačem "--quoting-style=c" (odpověď @Mib) Pozor ale na Solaris (fray), kde se soubory vypíší tak jak jsou, tedy i se "speciálními" znaky (\n \r ...). díky @hody@MiB@Josef Kokeš
VojtechMyslivec ( 2014-11-06 22:56:16 +0100 )editNepoužívá se k tomu náhodou ls -1?
Radomír Polách ( 2014-11-14 17:36:01 +0100 )editTak to je zklamání, ls -1 nefunguje.
Radomír Polách ( 2014-11-14 17:40:00 +0100 )editTak ls -q1 je workaround.
Radomír Polách ( 2014-11-14 20:29:22 +0100 )editNevím, co myslíš tím workaround, ale ls -q funguje na frayi tak, že \n \q nahradí za otazník. Good point
VojtechMyslivec ( 2014-11-20 10:18:00 +0100 )editWorkaround myslím to, že -1 by ve skutečnosti mělo dělat přesně to co je požadováno a to dát na jeden řádek jeden název, už jsem to nahlásil jako bug do coreutils, pravděpodobně se to ale bude řešit úpravou manuálových stránek než funkcionality.
Radomír Polách ( 2014-11-21 17:42:36 +0100 )edit