Belirli bir dizindeki ve belirli bir uzantıdaki toplam dosya sayısını say


32

".Mp4" uzantısı ile biten belirli bir dizindeki toplam dosya sayısını saymak istiyorum.

Aşağıdaki komutu alıyorum:

ls -F |grep -v / | wc -l

Belirli bir dizindeki tüm dosyaları sayar, ancak .mp4 uzantısı ile biten dosyaların sayısını istiyorum.

Bunun için herhangi bir Ubuntu komutu var mı?


2
Basit, doğru, anlaşılır cevap @ louis-matthijssen'dir. ls -1newline karakterlerinin kullanımı bu durumda lsçıktıların ayrıştırılması mantıklıdır . İşaretli olan -R bayrağının kullanımı için yanlış.
Rmano

Yanıtlar:


19

İşte bu şekilde yapabilirsiniz

ls -lR /path/to/dir/*.jpg | wc -l

Bu size sayımı verir


5
Neden -R? statSadece dosya adına ihtiyaç duyduğunuzda neden tam ? Neden olmasın ls -1 *.jpg| wc -l? (tamam, eğer içinde yeni satırlar olan bir dosya
adınız

2
... ve soru "bir dizindeki dosyaların sayısını saymak" idi. Dahası, bu, özgeçmiş olarak .jpg ile biten tüm alt dizinlerin içeriğini , biten alt dizinlerdeki dosyaları da listeleyecektir . Hiç test ettin mi? .jpg
Rmano

1
Soru, "belirli bir dizindeki dosyalar" yazıyor, bu da alt dizin yinelemesinin istenmediğini gösteriyor.
David Richerby

1
Ayrıca, dizinde çok fazla dosya varsa (çünkü *.jpgkabuk tarafından değil, genişletilirse ls) ve adları tire ile başlayan dosyalar varsa da başarısız olur .
David Richerby

2
@DavidRicherby Bu, ile başlayan isimleri atlar .. Ancak /path/to/dir, boş dize veya tire ile başlayan göreceli bir yol olması dışında, adlarda kısa çizgilerle çalışır . Ama daha önce yanıldım ve lskarakterlerin yerini değiştirdiğini söylemiştim ?. Stdout bir terminal olduğunda gerçekleşir, ancak burada çıktı bir boru olduğu için lstüm karakterleri dosya adlarından sonuna gönderir wc. Bu, cevabı-q-b , bu davranışı değiştirmek için veya işaretlemeden yanlış yapar , çünkü dosya isimleri yeni satırlar içerebilir. 100b0'ın cevabı bu problemlerden arındırılmış.
Eliah Kagan

42

Ne yazık ki bu iyi huylu sorunun tüm dosya adlarını destekleyen ve taşınabilir bir şekilde çözmek zordur. Bu güvenlidir (gizli dosyaları, boşluk içeren satırları, kısa çizgileri ve hatta yeni satırları kullanır) ve POSIX uyumludur :

find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c

Özyinelemeli olmasını istemiyorsanız, basitçe ekleyin -maxdepth 1.

lsÇıktıyı çözümlememelisin .

Ölçek:

$ cd -- "$(mktemp -d)"
$ touch -- -foo.mp4 .bar.mp4 .bat.mp4 'baz.mp4
> ban.mp4'
$ find . -mindepth 1 -type f -name "*.mp4" -exec printf x \; | wc -c
4

Kabul edilen cevap ile karşılaştırın :

$ ls -lR ./*.mp4 | wc -l
3

Veya diğer öneriler:

$ find . -name "*.mp4" | wc -l
5
$ ls -1 *.mp4 | wc -l
ls: invalid option -- '.'
Try 'ls --help' for more information.
0
$ find . -name "*.mp4" | wc -c # Answer fixed at a later time
51
$ find . -name "*.mp4" | wc -l
5
$ find . | grep -i ".mp4$" | wc -l
5
$ ls . | grep ".mp4$" | wc -l
3

2
Bu cevap doğru ve sağlam olsa da, -printf xyerine kullanabilirsiniz -exec printf x \;. Yani: find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c gerek yok -execharici printfsayıda dosya olacak varsa komutun, çok yavaş , çünkü findzorundadır çatal (2) daha sonra kendisi bir kopyasını kapalı ve (2) execve /usr/bin/printf . Bu -exec printf x \;, her dosya için bir kez yapılmalıdır .
Eliah Kagan

-printfPOSIX’de desteklenmiyorfind , bu yüzden kullanmadım.
l0b0

1
İkisi de -mindepthve -maxdepthkullandınız.
Eliah Kagan

İyi nokta, bunu anlamadım!
l0b0

BSD findiçerir -mindepthve -maxdepthiçermez, -printfbu yüzden ikisinin de dahil edilmesini takdir ediyorum.
Joseph,

11

Bu, tüm dosyaları uzantıya göre sıralar, sıralar ve listeler:

find . -type f | sed 's/.*\.//' | sort | uniq -c

Mükemmel! Sadece | sort -rnsonunda bir son ve belki -mindepth 1sadece geçerli bir dir eklerdim.
Pablo

Ve belki head -nde zirveye ulaşmak için pipo .
Raman,

harika bir cevap, çok teşekkürler
Dennis Golomazov

5

Bence aşağıdaki komutlar çok basit.

$ find . -name "*.mp4" | wc -l
8

veya

$ find . | grep -i ".mp4$" | wc -l
8

Yukarıdaki komutların, dosya ve dizin adlarının sayısını hesapladığını düşünüyorum. *.mp4

bu yüzden -type fseçeneği findaşağıdaki gibi parametre olarak kullanmanızı öneririm .

$ find . -name "*.mp4" -type f | wc -l
8

Ek olarak, ls -lR olarak kullanılabilirfind .


2

Kullanabilirsiniz ls -1 *.mp4 | wc -l.

Bu, biten tüm dosyaları listeleyip .mp4her dosyayı yeni bir satıra ( ls -1 *.mp4) basar wc, -lbayrağını kullanarak yeni satır sayısını sayar .


Bunun neden beğenilmediğinden emin değil, işe yarıyor
Panter

Yana *.mp4kabuk tarafından genişletilir, değil lsçok var ise, bu başarısız olur .mp4onlardan liste geçirilen edilemeyeceğini dizindeki dosyaları lsargümanlar olarak.
David Richerby

@Rmana Denilen dosyayı içeren bir dizinde test edin--.mp4
David Richerby

@DavidRicherby evet, haklısın. --ikinci durumu çözecek; Eski bir hata mesajı (çok fazla dosyaya ihtiyacınız var!) ve burada bir başka güzel soru ortaya çıkacaktır. Köşe durumlarda, ama fark etmeye değer, evet.
Rmano

1
@Rmano eklemeden -qveya -bbu mu değil Dosya adlarında yeni satır tahammül. Eğer çalıştırırsanız ls -1 *.mp4hiçbir boru ile terminalden, lsonun gördüğü stdout'u bir terminal olup sürer -qbaskı, ima olarak ?s. Ancak çıkış yapıldığında bu davranış ortadan kalkar. ls -1 *.mp4 | wc -lYeni satırlar varsa sayıları aşar. ls -1 *.mp4 | catne wc"görür" gösterir . (Benzer şekilde, -1stdout bir terminal olmadığında da belirtilir, bu nedenle isteğe bağlıdır.) ls -1q -- *.mp4 | wc -lNeredeyse çalışır, ancak sıfır .mp4 dosyasıyla çalışmaz.
Eliah Kagan

0

Bu size .mp4 olan dosyanın bir listesini vermelidir

ls /path/to/directory | grep ".mp4$"

İle birleştiğinde wc -lsize sayım verecek

ls /path/to/directory | grep ".mp4$" | wc -l

aramanın alt dizinleri içermesini istiyorsanız

ls -lR /path/to/directory | grep ".mp4$" | wc -l

sayılmaz
Panter

Ne zaman kullanıldığında bana verdiwc -l
Back.Slash

Cevabınızı aşmak ve kısaltmak için ls kullanmadan boru kullanın. Şimdi en az iki kez gönderildi.
Panter

@ bodhi.zazen ls /directory/*.mp4topak genişletmek ve böyle bir şey yürütmek için kabuk neden ls /directory/file1.mp4 /directory/file2.mp4 ...dizin argüman olarak geçirilebilir daha mp4 dosyaları içeriyorsa başarısız olur Bu ls.
David Richerby

@DavidRicherby - bu benim ls komutum değil, buluyorum;)
Panther


0
ls | grep --count \.csv$

Değiştir (.csv'yi istediğiniz uzantıyla)

Açıklama: Basit bir programın dosya listesini almak ve uzantıyı grep ile saymak olduğunu düşünüyorum. Satır sonunda uzantıyı \.eşleştirmek .ve $eşleştirmek için Çalışır, çünkü ls çıktısı alındığında satır başına bir dosya adı gönderilir ve çalıştırılarak doğrulanabilir:

ls | cat

1
Bunun yerine, grep --countkullanabileceğinizi de unutmayın grep -c.
Mohsin Raza,

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.