Jeg har en katalog med et stort antall filer. Jeg ser ikke en ls
-bryter for å gi tellingen. Er det noen kommandolinjemagi for å få en telling av filer?
Bruke en bred definisjon av "fil";
ls | wc -l
(merk at den ikke teller skjulte filer og forutsetter at filnavn ikke inneholder ny linje-tegn).
For å inkludere skjulte filer (unntatt .
og ..
) og unngå problemer med nylinjetegn, er den kanoniske måten:
find . ! -name . -prune -print | grep -c /
Eller rekursivt:
find .//. ! -name . -print | grep -c //
For snever definisjon av fil:
find . -maxdepth 1 -type f | wc -l
Hvis du vet at den gjeldende katalogen inneholder minst én ikke-skjult fil:
set -- *; echo "$#"
Dette kan åpenbart generaliseres til en hvilken som helst glob.
I et skript har dette den noen ganger uheldige bivirkningen av å overskrive posisjonsparametrene. Du kan omgå dette ved å bruke et subshell eller med en funksjon (Bourne/POSIX-versjon) som:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
En alternativ løsning er $(ls -d -- * | wc -l)
. Hvis glob er *
, kan kommandoen forkortes til $(ls | wc -l)
. Å analysere utdataene fra ls
gjør meg alltid urolig, men her skal det fungere så lenge filnavnene dine ikke inneholder nye linjer, eller ls
slipper dem. Og $(ls -d -- * 2>/dev/null | wc -l)
har fordelen av å håndtere tilfelle av en ikke-matchende glob grasiøst (dvs. det returnerer 0 i så fall, mens set *
metoden krever fiddly testing hvis glob kan være tom).
Hvis filnavn kan inneholde nylinjetegn, er et alternativ å bruke $(ls -d ./* | grep -c /)
.
Alle disse løsningene som baserer seg på å sende utvidelsen av en glob til ls
, kan feile med en argument list too long-feil hvis det er mange samsvarende filer.