it-swarm-tr.com

Komut satırını kullanarak bir dizindeki dosya sayısını nasıl alabilirim?

Çok sayıda dosya içeren bir dizin var. Sayımı sağlamak için bir ls anahtarı görmüyorum. Bir dosya sayısı elde etmek için bazı komut satırı sihirleri var mı?

219
Blake

"Dosya" nın geniş bir tanımını kullanma

ls | wc -l

(gizli dosyaları saymadığını ve dosya adlarının yeni satır karakteri içermediğini varsaydığını unutmayın).

Gizli dosyaları dahil etmek için (. ve ..) ve yeni satır karakterleriyle ilgili sorunlardan kaçınmak, kurallı yol:

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

Veya özyineli olarak:

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

Dosyanın dar tanımı için:

 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

Not: Not ls - <sayı-bir> | wc - <letter-l>

15
nicomen

du --inodes Dosyasını yararlı buldum, ancak du sürümünün gerektirdiğinden emin değilim. find ve wc kullanan alternatif yaklaşımlardan önemli ölçüde daha hızlı olmalıdır.

Ubuntu 17.10'da aşağıdakiler çalışır:

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

İçerilen inode sayısına göre azalanları sıralamak için | sort -nr İle birleştirin.

12
krlmlr

Muhtemelen ls/wc çiftini kullanan en eksiksiz cevap

ls -Aq | wc -l

nokta dosyalarını saymak istiyorsanız ve

ls -q | wc -l

aksi takdirde.

  • -A nokta dosyalarını saymak, ancak . ve ...
  • -q _ ls olmayan karakterleri, özellikle yeni satır karakterini ?, her dosya için çıktı 1 satırı yapma

Terminaldeki ls 'dan tek satırlık çıktı almak için (yani wc içine pipetlemeden), -1 seçeneği eklenmelidir.

(ls davranışı coreutils 8.23 ​​ile test edildi)

12
Frax

Geçerli dizinin gizli olmayan en az bir dosya içerdiğini biliyorsanız:

set -- *; echo "$#"

Bu açıkça herhangi bir glob için genelleştirilebilir.

Bir komut dosyasında, konumsal parametrelerin üzerine yazmanın bazen talihsiz yan etkisi vardır. Bir alt kabuk kullanarak veya aşağıdaki gibi bir işlevle (Bourne/POSIX sürümü) çalışabilirsiniz:

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

Alternatif bir çözüm $(ls -d -- * | wc -l)'dir. Glob * İse, komut $(ls | wc -l) olarak kısaltılabilir. ls çıktısını ayrıştırmak beni her zaman tedirgin ediyor, ancak burada dosya adlarınız satırsonu içermediği veya ls bunlardan kaçtığı sürece çalışmalıdır. Ve $(ls -d -- * 2>/dev/null | wc -l), eşleşmeyen bir glob vakasını zarif bir şekilde ele alma avantajına sahiptir (yani, bu durumda 0 döndürür, oysa set * Yöntemi, glob boş olabilirse sıkıca test gerektirir ).

Dosya adları yeni satır karakterleri içeriyorsa, başka bir seçenek $(ls -d ./* | grep -c /) kullanmaktır.

Bir glob genişlemesini ls değerine geçirmeye dayanan bu çözümlerden herhangi biri, çok fazla eşleşen dosya varsa bağımsız değişken listesi çok uzun hatasıyla başarısız olabilir.

-U ekliyorsak ls/wc çifti kullanırken çok daha hızlı olacaktır (sıralamayın).

ls -AqU | wc -l
5
Jbnair

Tree komutunu yükledikten sonra şunu yazın:

tree

Gizli dosyalar da istiyorsanız:

tree -a

Debian/Mint/Ubuntu Linux kullanıyorsanız, tree komutunu yüklemek için aşağıdaki komutu yazın:

Sudo apt-get install tree

-L seçeneği, dizin ağacının maksimum görüntüleme düzeyini belirtmek için kullanılır. Tree komutu, yalnızca dosya sayısını değil, aynı zamanda dizin ağacının istediğiniz sayıda düzeyini de dikkate alarak dizin sayısını sayar.

4
lev
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1 bunu özyinelemesiz yapar, find varsayılan olarak özyinelemeli
  • -type f yalnızca dosya içerecek
  • -printf . sevimli bir dokunuş. dosya adı yerine her dosya için bir nokta yazdırır ve şimdi bu herhangi bir dosya adını işleyebilir ve ayrıca verileri kaydeder; sadece noktaları saymalıyız :)
  • | wc -c karakter sayar
3
aude

Boru yok, dize kopyası yok, çatal yok, sadece düz bash bir astar

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

Linux'ta, komutu çok sağlam hale getirmek ve adlarında satırsonu olabilecek dosyaları işlemek için şunu kullanın:

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

Bu bizi ls çıktısının ordeal çıkışından kurtarır.


İlişkili:

1
codeforester

İşte bir Gilles yayınladı satırları boyunca başka bir teknik:

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

13,923 elemanlı bir dizi oluşturur (eğer kaç dosya varsa).

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

Bu yalnızca geçerli dizindeki dosyaları listeleyebilir.

1
srpatch

Daha önce verilen bazı cevapların iyileştirilmesi ancak bu sefer açıkça yapılması.

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

tail ve cut gibi bazı sevilen komutların kullanıldığını fark etmeye değer. Ayrıca, ağacın varsayılan olarak kullanılamadığını unutmayın. Yukarıdaki komut önce 1. düzeydeki dizinle ilgili bilgileri yakalar, ardından son satırı tail -n 1 hedefimizdir ve üçüncü kelimeyi almak için cut ile sonuçlanır.

Örneğin, /:

/ $ 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

Peki, dizin sayısını sormaya ne dersiniz?

0
jonaprieto

Bunu dene umarım bu cevap sana yardımcı olur

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

Şunları kontrol edebilirsiniz:

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