Belirli bir uzantıya sahip dosyaları ve içinde bulundukları dizinleri nasıl sayabilirim?


14

.cGeniş bir karmaşık dizin yapısında kaç normal dosyanın uzantısına sahip olduğunu ve ayrıca bu dosyaların kaç dizine yayıldığını bilmek istiyorum . İstediğim çıktı sadece bu iki sayı.

Dosya sayısını nasıl alacağınızla ilgili bu soruyu gördüm , ancak dosyaların da içinde bulunduğu dizin sayısını bilmem gerekiyor.

  • Dosya adlarımın (dizinler dahil) herhangi bir karakteri olabilir; bunlar .veya ile başlayabilir -ve boşlukları veya yeni satırları olabilir.
  • İsimleri ile biten bazı linklerim .cve dizinlerle olan linklerim olabilir . Simgelerin takip edilmesini veya sayılmasını istemiyorum ya da en azından bunların sayılarak hesaplanıp hesaplanmadığını bilmek istiyorum.
  • Dizin yapısının birçok düzeyi vardır ve üst düzey dizinin (çalışma dizini) içinde en az bir .cdosya vardır.

Aceleyle (Bash) kabuğuna kendim saymak için bazı komutlar yazdım, ancak sonucun doğru olduğunu düşünmüyorum ...

shopt -s dotglob
shopt -s globstar
mkdir out
for d in **/; do
     find "$d" -maxdepth 1 -type f -name "*.c" >> out/$(basename "$d")
done
ls -1Aq out | wc -l
cat out/* | wc -l

Bu, belirsiz yönlendirmelerle ilgili şikayetler çıkarır, geçerli dizindeki dosyaları kaçırır ve özel karakterlere gider (örneğin, yönlendirilen findçıktı dosya adlarında yeni satırlar yazdırır ) ve bir sürü boş dosya (ayy) yazar.

.cDosyalarımı ve içerdiği dizinleri nasıl güvenilir bir şekilde numaralandırabilirim ?


Yardımcı olması durumunda, kötü adlara ve semboliklere sahip bir test yapısı oluşturmak için bazı komutlar şunlardır:

mkdir -p cfiles/{1..3}/{a..b} && cd cfiles
mkdir space\ d
touch -- i.c -.c bad\ .c 'terrible
.c' not-c .hidden.c
for d in space\ d 1 2 2/{a..b} 3/b; do cp -t "$d" -- *.c; done
ln -s 2 dirlink
ln -s 3/b/i.c filelink.c

Ortaya çıkan yapıda, 7 dizin .cdosya içerir ve 29 normal dosya biter .c( dotglobkomutlar çalıştırıldığında kapalıysa) (yanlış saydım, lütfen bana bildirin). Bunlar istediğim rakamlar.

Çekinmeyin değil bu özel testini kullanmak.

Not: Herhangi bir kabuk veya başka bir dilde cevaplar benim tarafımdan test edilecek ve takdir edilecektir. Yeni paketler yüklemem gerekirse sorun yok. Bir GUI çözümü biliyorsanız, paylaşmanızı öneririm (ancak test etmek için bütün bir DE yüklemek için o kadar ileri gidemeyebilirim) :) Ubuntu MATE 17.10 kullanıyorum.


Kötü programlama alışkanlıklarıyla başa çıkmak için bir program yazmak oldukça zordur;)
WinEunuuchs2Unix 13:18 '

Yanıtlar:


16

Çıktıları sembolik linklerle incelemedim ama:

find . -type f -iname '*.c' -printf '%h\0' |
  sort -z |
  uniq -zc |
  sed -zr 's/([0-9]) .*/\1 1/' |
  tr '\0' '\n' |
  awk '{f += $1; d += $2} END {print f, d}'
  • findKomut her dizin adı basar .cbulduğu dosyanın.
  • sort | uniq -cbize her dizinde kaç dosya olduğunu verir ( sortburada gereksiz olabilir, emin değilim)
  • ile sed, dizin adını değiştiririm 1, böylece tüm tuhaf karakterleri, sadece sayı ve 1kalan
  • ile yeni satır ayrılmış çıktıya dönüştürmem için tr
  • daha sonra toplam dosya sayısını ve bu dosyaları içeren dizin sayısını almak için awk ile özetliyor. dBurada esasen aynı olduğunu unutmayın NR. Ben takmadan ihmal olabilirdi 1içinde sedkomuta ve sadece basılı NRburada, ama bu biraz daha net olduğunu düşünüyorum.

Ana kadar tr, verileri tüm geçerli dosya adları karşı güvenli, NUL ayrılmış olduğunu.


Zsh ve bash ile, printf %qiçinde yeni satırlar olmayacak alıntılanmış bir dize almak için kullanabilirsiniz . Yani, şöyle bir şey yapabilirsiniz:

shopt -s globstar dotglob nocaseglob
printf "%q\n" **/*.c | awk -F/ '{NF--; f++} !c[$0]++{d++} END {print f, d}'

Ancak, **dizinlere sembolik bağlar için genişlemesi gerekmese de , 4.4.18 (1) (Ubuntu 16.04) bash üzerinde istenen çıktıyı alamadım.

$ shopt -s globstar dotglob nocaseglob
$ printf "%q\n" ./**/*.c | awk -F/ '{NF--; f++} !c[$0]++{d++} END {print f, d}'
34 15
$ echo $BASH_VERSION
4.4.18(1)-release

Ancak zsh iyi çalıştı ve komut basitleştirilebilir:

$ printf "%q\n" ./**/*.c(D.:h) | awk '!c[$0]++ {d++} END {print NR, d}'
29 7

Dbu glob'un nokta dosyalarını seçmesini sağlar, .normal dosyaları seçer (sembolik bağlantıları değil) ve dosya adını değil, :hyalnızca dizin yolunu yazdırır ( find's gibi %h) (Bkz. Dosya Adı Üretimi ve Değiştiricileri bölümleri ). Awk komutu ile sadece görünen benzersiz dizinlerin sayısını saymamız gerekir ve satır sayısı dosya sayısıdır.


Bu harika. Tam olarak neye ihtiyaç duyduğunu kullanır, artık yok.
Öğrettiğiniz

@Zanna, sembol bağlantılarıyla bir dizin yapısı ve sembolik bağlantılarla beklenen çıktıyı yeniden oluşturmak için bazı komutlar gönderirseniz, bunu buna göre düzeltebilirim.
muru

Simgelerle (her zamanki gibi gereksiz karmaşık) bir test yapısı yapmak için bazı komutlar ekledim.
Zanna

@Zanna Bence bu komutun herhangi bir ayarlamaya ihtiyacı yok 29 7. Ben eklerseniz -Liçin find, o kadar çıkıyor 41 10. Hangi çıktıya ihtiyacınız var?
muru

1
Bir zsh + awk yöntemi eklendi. Muhtemelen zsh'in sayısını benim için yazdırmasını sağlamanın bir yolu var, ama nasıl olduğu hakkında bir fikrim yok.
muru

11

Python os.walk, bu gibi görevleri, yeni satır karakterleri gibi garip dosya adları karşısında bile kolay, sezgisel ve otomatik olarak sağlam kılar. Başlangıçta sohbette yayınlamış olduğum bu Python 3 betiği, geçerli dizinde çalıştırılmak üzere tasarlanmıştır (ancak geçerli dizinde bulunmasına gerek yoktur ve hangi yolu geçeceğini değiştirebilirsiniz os.walk):

#!/usr/bin/env python3

import os

dc = fc = 0
for _, _, fs in os.walk('.'):
    c = sum(f.endswith('.c') for f in fs)
    if c:
        dc += 1
        fc += c
print(dc, fc)

Bu, doğrudan adı biten en az bir dosya .c, ardından bir boşluk ve ardından adları biten dosya sayısını içeren dizin sayısını yazdırır .c. "Gizli" dosyalar - yani adları ile başlayan dosyalar - .dahil edilir ve gizli dizinler benzer şekilde gezilir.

os.walkbir dizin hiyerarşisini özyinelemeli olarak geçirir. Verdiğiniz başlangıç ​​noktasından özyinelemeli olarak erişilebilen tüm dizinleri numaralandırır ve her biri hakkında üç değerden oluşan bir demet olarak bilgi verir root, dirs, files. Geçtiği her dizin için (adını verdiğiniz ilk dizin dahil):

  • rootbu dizinin yol adını tutar. Not Bu sistemin "kök dizinine" tamamen ilişkisiz olduğunu /(ayrıca ilgisiz ve /rootolsa) olur orada başlarsan o gidin. Bu durumda --ie, geçerli dizin rootyolunda başlar .ve altındaki her yere gider.
  • dirsadı şu anda tutulan dizinin tüm alt dizinlerinin yol adlarının bir listesini tutar root.
  • files, adı şu anda tutulan ancak kendinde dizin olmayan dizinde bulunan tüm dosyaların yol adlarının bir listesini tutar root. Bunun, sembolik bağlantılar da dahil olmak üzere normal dosyalardan başka dosya türlerini içerdiğini, ancak bu tür girişlerin bitmesini beklemediğiniz .cve bu gibi herhangi bir şeyi görmekle ilgilendiğinizi unutmayın.

Bu durumda, sadece grubun üçüncü bileşenini incelemem gerekir files(bu fssenaryoda çağırırım ). Gibi findkomuta, Python var os.walkbenim için alt dizinleri içine traversini; kendimi denetlemem gereken tek şey, her birinin içerdiği dosyaların adları. findKomutun aksine , os.walkotomatik olarak bana bu dosya adlarının bir listesini sağlar.

Bu komut dosyası sembolik bağlantıları izlemiyor. Çok büyük olasılıkla yok hiçbir döngüleri olmasa bile, aynı dosyalar ve dizinleri gidilebileceğini ve farklı sembolik yoluyla erişilebilir birden çok kez sayılır çünkü onlar çevreleri oluşturamaz ve çünkü sembolik bağ, böyle bir operasyon için takip istiyoruz.

Eğer hiç istemediğiniz os.walksembolik bağları takip etmek istediyseniz followlinks=true, buna geçebilirsiniz . Yani os.walk('.')yazmak yerine yazabilirsiniz os.walk('.', followlinks=true). Nadiren, özellikle ne kadar büyük olursa olsun, tüm dizin yapısını yinelemeli olarak numaralandırdığınız ve bazı gereksinimleri karşılayan tüm dosyaları saydığınız böyle bir görev için istediğinizi yineliyorum.


7

Bul + Perl:

$ find . -type f -iname '*.c' -printf '%h\0' | 
    perl -0 -ne '$k{$_}++; }{ print scalar keys %k, " $.\n" '
7 29

açıklama

find(Hayır sembolik bağlar veya dizinleri böylece) ve daha sonra içinde bulundukları dizinin adını yazdırmak komutu herhangi bir normal dosyaları bulacaksınız ( %h) ve ardından \0.

  • perl -0 -ne: girişi satır satır ( -n) okuyun ve -eher satıra verilen komut dosyasını uygulayın . -0Giriş hat ayırıcı setleri \0biz boş ayrılmış girdi okuyabilir böylece.
  • $k{$_}++: $_geçerli satırın değerini alan özel bir değişkendir. Bu, değerleri her giriş satırının (dizin adı) kaç kez görüldüğü karma için bir anahtar olarak kullanılır %k.
  • }{: bu kestirme bir yol END{}. }{Tüm girdiler işlendikten sonra, komuttan sonraki tüm komutlar bir kez yürütülür.
  • print scalar keys %k, " $.\n": keys %kkarma içindeki anahtarların bir dizisini döndürür %k. scalar keys %kdizideki öğelerin sayısını, görülen dizin sayısını verir. Bu, $.geçerli giriş satırı numarasını tutan özel bir değişken olan geçerli değeri ile birlikte yazdırılır . Bu sonunda çalıştırıldığından, geçerli giriş satırı numarası son satırın numarası olacaktır, bu nedenle şimdiye kadar görülen satır sayısı olacaktır.

Açıklık sağlamak için perl komutunu buna genişletebilirsiniz:

find  . -type f -iname '*.c' -printf '%h\0' | 
    perl -0 -e 'while($line = <STDIN>){
                    $dirs{$line}++; 
                    $tot++;
                } 
                $count = scalar keys %dirs; 
                print "$count $tot\n" '

4

İşte benim önerim:

#!/bin/bash
tempfile=$(mktemp)
find -type f -name "*.c" -prune >$tempfile
grep -c / $tempfile
sed 's_[^/]*$__' $tempfile | sort -u | grep -c /

Bu kısa komut dosyası bir geçici dosya oluşturur, geçerli dizindeki ve altındaki tüm dosyaları bulur .cve listeyi geçici dosyaya yazar. grepSonra (Aşağıdaki dosyaları saymak için kullanılır ? Ben komut satırını kullanarak bir dizindeki dosyaların sayısını nasıl alabilirim ikinci kez kullanılarak çıkarılmış olduğu birden çok kez listelenen dizinleri: iki kez) sort -ukullanarak her satırından dosya sıyırma sonra sed.

Bu, dosya adlarındaki yeni satırlarla da düzgün çalışır: grep -c /yalnızca eğik çizgi içeren satırları sayar ve bu nedenle listedeki çok satırlı dosya adının yalnızca ilk satırını dikkate alır.

Çıktı

$ tree
.
├── 1
   ├── 1
      ├── test2.c
      └── test.c
   └── 2
       └── test.c
└── 2
    ├── 1
       └── test.c
    └── 2

$ tempfile=$(mktemp);find -type f -name "*.c" -prune >$tempfile;grep -c / $tempfile;sed 's_[^/]*$__' $tempfile | sort -u | grep -c /
4
3

4

Küçük kabuk komut dosyası

Ben iki ana komut satırı (ve filetypediğer dosya türlerini aramak için geçiş kolaylaştırmak için bir değişken) ile küçük bir bash shellscript öneririz .

Symlinks içinde veya içinde değil, sadece normal dosyaları arar.

#!/bin/bash

filetype=c
#filetype=pdf

# count the 'filetype' files

find -type f -name "*.$filetype" -ls|sed 's#.* \./##'|wc -l | tr '\n' ' '

# count directories containing 'filetype' files

find -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)'" \;|grep 'contains file(s)$'|wc -l

Ayrıntılı shellscript

Bu, sembolik bağlantıları da dikkate alan daha ayrıntılı bir versiyon,

#!/bin/bash

filetype=c
#filetype=pdf

# counting the 'filetype' files

echo -n "number of $filetype files in the current directory tree: "
find -type f -name "*.$filetype" -ls|sed 's#.* \./##'|wc -l

echo -n "number of $filetype symbolic links in the current directory tree: "
find -type l -name "*.$filetype" -ls|sed 's#.* \./##'|wc -l
echo -n "number of $filetype normal files in the current directory tree: "
find -type f -name "*.$filetype" -ls|sed 's#.* \./##'|wc -l
echo -n "number of $filetype symbolic links in the current directory tree including linked directories: "
find -L -type f -name "*.$filetype" -ls 2> /tmp/c-counter |sed 's#.* \./##' | wc -l; cat /tmp/c-counter; rm /tmp/c-counter

# list directories with and without 'filetype' files (good for manual checking; comment away after test)
echo '---------- list directories:'
 find    -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)' || echo '{} empty'" \;
echo ''
#find -L -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)' || echo '{} empty'" \;

# count directories containing 'filetype' files

echo -n "number of directories with $filetype files: "
find -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)'" \;|grep 'contains file(s)$'|wc -l

# list and count directories including symbolic links, containing 'filetype' files
echo '---------- list all directories including symbolic links:'
find -L -type d -exec bash -c "ls -AF '{}' |grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)' || echo '{} empty'" \;
echo ''
echo -n "number of directories (including symbolic links) with $filetype files: "
find -L -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)'" \; 2>/dev/null |grep 'contains file(s)$'|wc -l

# count directories without 'filetype' files (good for checking; comment away after test)

echo -n "number of directories without $filetype files: "
find -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null || echo '{} empty'" \;|grep 'empty$'|wc -l

Test çıktısı

Kısa shellscript'ten:

$ ./ccntr 
29 7

Ayrıntılı shellscript'ten:

$ LANG=C ./c-counter
number of c files in the current directory tree: 29
number of c symbolic links in the current directory tree: 1
number of c normal files in the current directory tree: 29
number of c symbolic links in the current directory tree including linked directories: 42
find: './cfiles/2/2': Too many levels of symbolic links
find: './cfiles/dirlink/2': Too many levels of symbolic links
---------- list directories:
. empty
./cfiles contains file(s)
./cfiles/2 contains file(s)
./cfiles/2/b contains file(s)
./cfiles/2/a contains file(s)
./cfiles/3 empty
./cfiles/3/b contains file(s)
./cfiles/3/a empty
./cfiles/1 contains file(s)
./cfiles/1/b empty
./cfiles/1/a empty
./cfiles/space d contains file(s)

number of directories with c files: 7
---------- list all directories including symbolic links:
. empty
./cfiles contains file(s)
./cfiles/2 contains file(s)
find: './cfiles/2/2': Too many levels of symbolic links
./cfiles/2/b contains file(s)
./cfiles/2/a contains file(s)
./cfiles/3 empty
./cfiles/3/b contains file(s)
./cfiles/3/a empty
./cfiles/dirlink empty
find: './cfiles/dirlink/2': Too many levels of symbolic links
./cfiles/dirlink/b contains file(s)
./cfiles/dirlink/a contains file(s)
./cfiles/1 contains file(s)
./cfiles/1/b empty
./cfiles/1/a empty
./cfiles/space d contains file(s)

number of directories (including symbolic links) with c files: 9
number of directories without c files: 5
$ 

4

Basit Perl bir astar:

perl -MFile::Find=find -le'find(sub{/\.c\z/ and -f and $c{$File::Find::dir}=++$c}, @ARGV); print 0 + keys %c, " $c"' dir1 dir2

Veya find komutla :

find dir1 dir2 -type f -name '*.c' -printf '%h\0' | perl -l -0ne'$c{$_}=1}{print 0 + keys %c, " $."'

Golf oynamaktan hoşlanıyorsanız ve son zamanlarda (on yıldan daha eski olmayan) Perl:

perl -MFile::Find=find -E'find(sub{/\.c$/&&-f&&($c{$File::Find::dir}=++$c)},".");say 0+keys%c," $c"'
find -type f -name '*.c' -printf '%h\0'|perl -0nE'$c{$_}=1}{say 0+keys%c," $."'

2

Şundan locateçok daha hızlı olan komutu kullanmayı düşünün.find komutu .

Test verilerinde çalışma

$ sudo updatedb # necessary if files in focus were added `cron` daily.
$ printf "Number Files: " && locate -0r "$PWD.*\.c$" | xargs -0 -I{} sh -c 'test ! -L "$1" && echo "regular file"' _  {} | wc -l &&  printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -cu | wc -l
Number Files: 29
Number Dirs.: 7

Unix ve Linux yanıtındaki dosya sayısından sembolik bağlantılar çıkarmama yardımcı olduğu için Muru'ya teşekkürler. .

Terdon'a Unix ve Linux cevabındaki$PWD (bana yöneltilmemiş) cevabı için teşekkürler .


Aşağıdaki yorumlardan referans alınan orijinal yanıt

Kısa form:

$ cd /
$ sudo updatedb
$ printf "Number Files: " && locate -cr "$PWD.*\.c$"
Number Files: 3523
$ printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l 
Number Dirs.: 648
  • sudo updatedbBugün dosyalar oluşturulduysa veya bugün dosyaları sildiyseniz , locatekomut tarafından kullanılan veritabanını güncelle ..c.c
  • locate -cr "$PWD.*\.c$".cgeçerli dizindeki tüm dosyaları ve alt öğelerini ( $PWD) bulun . Dosya adlarını yazdırmak yerine -cbağımsız değişken ile baskı sayısını yazdırın . Çok fazla sonuç verebilecek rvarsayılan *pattern*eşleme yerine normal ifadeyi belirtir .
  • locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l. *.cGeçerli dizindeki ve altındaki tüm dosyaları bulun . sedYalnızca dizin adı bırakarak dosya adını kaldırın . Kullanarak her dizindeki dosya sayısını sayın uniq -c. İle dizin sayısını sayın wc -l.

Geçerli dizinde tek astarla başla

$ cd /usr/src
$ printf "Number Files: " && locate -cr "$PWD.*\.c$" &&  printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
Number Files: 3430
Number Dirs.: 624

Dosya sayımı ve dizin sayımının nasıl değiştiğine dikkat edin. Tüm kullanıcıların /usr/srcdizine sahip olduğuna ve yüklü çekirdeklerin sayısına bağlı olarak farklı sayılarla yukarıdaki komutların çalışabileceğine inanıyorum .

Uzun Form:

Uzun form zaman içerir, böylece ne kadar hızlı locatebittiğini görebilirsiniz find. Koşmak sudo updatedbzorunda olsanız bile , bir single'dan çok daha hızlıdır find /.

───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ sudo time updatedb
0.58user 1.32system 0:03.94elapsed 48%CPU (0avgtext+0avgdata 7568maxresident)k
48inputs+131920outputs (1major+3562minor)pagefaults 0swaps
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Files: " && locate -cr $PWD".*\.c$")
Number Files: 3523

real    0m0.775s
user    0m0.766s
sys     0m0.012s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate -r $PWD".*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l) 
Number Dirs.: 648

real    0m0.778s
user    0m0.788s
sys     0m0.027s
───────────────────────────────────────────────────────────────────────────────────────────

Not: Bu, TÜM sürücüler ve bölümlerdeki tüm dosyalardır . yani Windows komutlarını da arayabiliriz:

$ time (printf "Number Files: " && locate *.exe -c)
Number Files: 6541

real    0m0.946s
user    0m0.761s
sys     0m0.060s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate *.exe | sed 's%/[^/]*$%/%' | uniq -c | wc -l) 
Number Dirs.: 3394

real    0m0.942s
user    0m0.803s
sys     0m0.092s

Otomatik olarak bağlanmış üç Windows 10 NTFS bölümüm var /etc/fstab . Bul her şeyi bilir farkında olun!

İlginç Sayım:

$ time (printf "Number Files: " && locate / -c &&  printf "Number Dirs.: " && locate / | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Files: 1637135
Number Dirs.: 286705

real    0m15.460s
user    0m13.471s
sys     0m2.786s

286.705 dizinde 1.637.135 dosyayı saymak 15 saniye sürer. YMMV.

locateKomutun normal ifade kullanımıyla ilgili ayrıntılı bir döküm için (bu soru ve cevapta gerekli görünmüyor, ancak her ihtimale karşı kullanılıyor) lütfen bunu okuyun: Belirli bir dizin altında "locate" kullanın?

Son makalelerden ek okumalar:


1
Bu, belirli bir dizindeki dosyaları saymaz. İşaret ettiğiniz gibi, eşleşen tüm dosyaları (veya dizinleri veya başka bir dosya türünü) sayar ( alıntı yapmadığınızdan beri geçerli dizinde .cbir dosya varsa kırılacağını unutmayın ) ve ardından tüm dizinleri yazdırır sistemde, .c dosyalarını içerip içermediklerine bakılmaksızın. -.c*.c
terdon

@terdon Bir dizini iletebilirsiniz ~/my_c_progs/*.c. .cProgramlarla birlikte 638 dizin sayıyor , toplam dizinler daha sonra gösteriliyor 286,705. "* .C" çift tırnak için cevabı revize edeceğim. Bahşiş için teşekkürler.
WinEunuuchs2Unix

3
Evet, böyle bir şey kullanabilirsiniz locate -r "/path/to/dir/.*\.c$", ancak cevabınızda hiçbir yerde bahsedilmiyor. Sadece bundan bahseden başka bir cevaba bağlantı verirsiniz, ancak burada sorulan soruya cevap vermek için nasıl uyarlanacağına dair bir açıklama yoktur. Tüm yanıtınız, sistemdeki toplam dosya ve dizin sayısının nasıl hesaplanacağına odaklanır; bu, ".c dosyalarının sayısını ve içeren dizinlerin sayısını nasıl sayabilirim?" msgstr "% s: belirli bir dizindeki c dosyaları". Ayrıca, numaralarınız yanlış, OP'deki örnekte deneyin.
terdon

@terdon Girişiniz için teşekkürler. Ben senin önerilerle cevap ve diğer SE sitesinde yayınlanan bir cevap geliştirdik $PWDdeğişken: unix.stackexchange.com/a/188191/200094
WinEunuuchs2Unix

1
Şimdi $PWDbir regex
muru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.