it-swarm-eu.dev

Jak mohu získat počet souborů v adresáři pomocí příkazového řádku?

Mám adresář s velkým počtem souborů. Nevidím přepínač ls, který by počítal. Existuje nějaká magie příkazového řádku, aby se získal počet souborů?

219
Blake

Použití široké definice „souboru“

ls | wc -l

(Všimněte si, že to nepočítá skryté soubory a předpokládá, že názvy souborů neobsahují znaky nového řádku).

Zahrnutí skrytých souborů (kromě . a ..) a vyhnout se problémům s novými řádky, kanonickým způsobem je:

find . ! -name . -Prune -print | grep -c /

Nebo rekurzivně:

find .//. ! -name . -print | grep -c //
279
James Roth

Pro úzkou definici souboru:

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
ls -1 | wc -l

...

$ ls --help | grep -- '  -1'
    -1                         list one file per line

...

$ wc --help | grep -- '  -l'
    -l, --lines            print the newline counts

PS: Poznámka ls - <number-one> | wc - <letter-l>

15
nicomen

Našel jsem du --inodes užitečné, ale nejsem si jistý, jakou verzi du vyžaduje. Měl by být podstatně rychlejší než alternativní přístupy používající find a wc.

Na Ubuntu 17.10 funguje následující:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Kombinováno s | sort -nr seřadit sestupně podle počtu obsahujících inodů.

12
krlmlr

Pravděpodobně nejkompletnější odpověď pomocí páru ls/wc je

ls -Aq | wc -l

pokud chcete spočítat tečky, a

ls -q | wc -l

v opačném případě.

  • -A má spočítat tečky, ale vynechat . a ...
  • -q make ls nahradí negrafické znaky, konkrétně znak nové řádky, znakem ?, čímž se vytvoří 1 řádek pro každý soubor

Chcete-li získat jeden řádkový výstup z ls v terminálu (tj. Bez jeho připojení do wc), -1 musí být přidána volba.

(chování ls testováno s coreutils 8.23)

12
Frax

Pokud víte, aktuální adresář obsahuje alespoň jeden nezakrytý soubor:

set -- *; echo "$#"

To je zjevně zobecitelné pro jakoukoli planetu.

Ve skriptu to má někdy nešťastný vedlejší účinek přepisování pozičních parametrů. Můžete to vyřešit pomocí subshell nebo pomocí funkce (Bourne/POSIX verze) jako:

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

Alternativní řešení je $(ls -d -- * | wc -l). Pokud je glob *, Lze příkaz zkrátit na $(ls | wc -l). Analýza výstupu ls mě vždy znepokojuje, ale tady by to mělo fungovat tak dlouho, dokud vaše názvy souborů neobsahují nové řádky nebo je ls unikne. A $(ls -d -- * 2>/dev/null | wc -l) má výhodu v tom, že řeší případ neshodného globu elegantně (tj. V tomto případě vrací 0, zatímco metoda set * Vyžaduje fiddly testování, pokud by glob mohl být prázdný) ).

Pokud názvy souborů mohou obsahovat znaky nového řádku, alternativou je použití $(ls -d ./* | grep -c /).

Některá z těchto řešení, která spoléhají na předání expanze globu na ls, mohou selhat s chybou seznam argumentů je příliš dlouhý, pokud existuje mnoho odpovídajících souborů.

Pokud použijeme pár ls/wc, pokud přidáme -U, bude to mnohem rychlejší (netřídit).

ls -AqU | wc -l
5
Jbnair

Po instalaci příkazu tree stačí zadat:

tree

Pokud chcete také skryté soubory:

tree -a

Pokud používáte Debian/Mint/Ubuntu Linux, zadejte následující příkaz a nainstalujte stromový příkaz:

Sudo apt-get install tree

Volba -L se používá pro určení maximální úrovně zobrazení stromu adresářů. Příkaz tree počítá nejen počet souborů, ale také počet adresářů, přičemž bere v úvahu tolik úrovní stromu adresářů, kolik chcete.

4
lev
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1 způsobí, že nebude rekurzivní, find je ve výchozím nastavení rekurzivní
  • -type f bude zahrnovat pouze soubory
  • -printf . je roztomilý dotek. Vytiskne tečku pro každý soubor namísto názvu souboru a nyní je možné zpracovat libovolný název souboru a také uložit data; musíme spočítat tečky :)
  • | wc -c počítá znaky
3
aude

Žádná dýmka, žádná řetězcová kopie, žádná vidlička, jen obyčejná bash jedna vložka

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
1
DaboD

Chcete-li v systému Linux učinit příkaz velmi robustním a zpracovat soubory, které mohou mít v názvu nové řádky, použijte toto:

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

To nás zachrání před výstupem ordeal analýzy ls.


Příbuzný:

1
codeforester

Tady je další technika v souladu s jedna zveřejněná Gilles :

Word_count () { local c=("[email protected]"); echo "${#c[@]}"; }
file_count=$(Word_count *)

což vytváří pole s 13 923 prvky (pokud je to počet souborů).

find . -type f -maxdepth 1 |  wc -l 

Tím lze zobrazit pouze soubory v aktuálním adresáři.

1
srpatch

Vylepšení některých odpovědí uvedených dříve, ale tentokrát explicitně.

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

Je vhodné si všimnout použití některých milovaných příkazů jako tail a cut. Všimněte si také, že strom není ve výchozím nastavení k dispozici. Příkaz nad prvním zachycením informací o adresáři na úrovni 1 a následným získáním posledního řádku tail -n 1 kde je náš cíl, a nakonec s cut vezměte třetí slovo.

Například umístění v /:

/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1

A co tedy dotaz na počet adresářů?

0
jonaprieto

Zkuste to, doufám, že vám tato odpověď pomůže

echo $((`ls -l | wc -l` -1 ))
0
Tiger

Můžete zkontrolovat pomocí:

ls -l | grep -v ^l | wc -l
0
AMIC MING