Dosya sayısını saymak için Bash betiği


11

Bir senaryom var ve bir dosya varsa veya yoksa farklı mesajlar görüntülemek istiyorum. Benim gibi bir senaryo var:

count=ls /import/*.zip | wc -l

echo "Number of files: " $count
if [ "$count" > "0" ]; then
    echo "Import $count files"
else
    echo "**** No files found ****"
fi

Ancak, dosya yoksa, bu No such file or directory0 dosya yerine gösterilir . Dizinde bir dizin var /import/, bu yüzden lsher zaman 0'dan büyük bir değer döndüreceği için sadece bir komut yapamam .

Belirli bir uzantının (.zip, .gz vb.) Dosya sayısını nasıl sayabilirim ve bu değeri bir bash betiğinde hem dosya sayısını görüntülemek hem de farklı iletileri görüntülemek için bir if deyiminde nasıl kullanabilirim?

Yanıtlar:


15

count=$(find /import -maxdepth 1 -name '*.zip' | wc -l)


1
Yalnızca geçerli dizindeki dosyaları saymak için -maxdepth 1 ekledim
Wallace Sean

1
Bu çağrıldığında geçerli dizinde herhangi bir .zip dosyası olması durumunda '* .zip' değerini alıntılamak istersiniz, bu durumda kabuk sizin için * .zip'i sizin için genişletmiş olur. (1).
Phil P

4

Şunu deneyin:

count=$(find /import/ -maxdepth 1 -type f -name '*.zip' | wc -l)
...
if [ $count -gt 0 ] ; then
  ...
else
  ...
fi

Fikir, STDERR'a bitbucket'e göndererek yazdırılan "böyle bir dosya yok" hatasını gizlemek ve sayıları karşılaştırmak için uygun test fonksiyonunu kullanmaktır. ( -gt"Büyüktür" anlamına gelir. De var -eq, -lt, -gevs.)


Alternatif olarak, ayrıca yapabilircount=$(find /import -type f -name "*.zip" | wc -l)
slillibri

Tabii ki, ancak bunun ls /import/*.zipalt dizinler varsa farklı bir anlamı var
Mat

Alt dizinlerdeki dosyaları saymayı önlemek için maxdepth'i ayarladım ve komut dosyasını -gt kullanmak üzere güncelledim. Yardımınız için teşekkürler
Wallace Sean

Dizinde ls çağırma için argv'ye sığacak çok fazla dosya varsa bu başarısız olur.
Phil P

Ah doğru. Bir findvaryant ile düzeltildi .
Mat

0

Ben hiç bir dosya o eşleşme yokken, beklendiği gibi Senaryonuzu denenmiş ve yok çıktıda 0 dosyaları göstermek değil, aynı zamanda gösteriyor lshemen önce hatayı. Bunu çözmek oldukça kolay, hendeklere gerek yok ls. İlk satırı bununla değiştirin:

count=$(ls /import/*.zip 2>/dev/null| wc -l)

2>/dev/null/dev/nullhata mesajını bastırarak stderr öğesine yönlendirir .

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.