Bash script untuk menghitung jumlah file

11

Saya memiliki skrip dan saya ingin menampilkan pesan yang berbeda jika ada file atau tidak. Saya punya skrip seperti:

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

Namun, jika tidak ada file, ini menunjukkan No such file or directorybukan 0 file. Ada direktori di /import/direktori, jadi saya tidak bisa hanya melakukan lsperintah karena itu akan selalu mengembalikan nilai lebih besar dari 0.

Bagaimana saya bisa menghitung jumlah file dari ekstensi tertentu (.zip, .gz, dll.) Dan menggunakan nilai itu dalam skrip bash untuk menampilkan jumlah file dan kemudian menggunakannya dalam pernyataan if untuk menampilkan pesan yang berbeda?

Wallace Sean
sumber

Jawaban:

15

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

Chris Ting
sumber
1
Saya menambahkan -maxdepth 1 untuk hanya menghitung file di direktori saat ini
Wallace Sean
1
Anda mungkin ingin mengutip '* .zip' seandainya ada file .zip di direktori saat ini ketika ini dipanggil, dalam hal ini shell akan memperluas * .zip untuk Anda, sementara Anda ingin itu melewati untuk menemukan (1)
Phil P
4

Coba dengan ini:

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

Idenya adalah untuk menyembunyikan kesalahan "tidak ada file" yang dicetak ke STDERR dengan mengirimkannya ke bitbucket, dan menggunakan fungsi pengujian yang tepat untuk membandingkan angka. ( -gtSingkatan dari "lebih besar dari". Ada juga -eq, -lt, -ge, dll)

Tikar
sumber
Sebagai alternatif, Anda juga bisa melakukannyacount=$(find /import -type f -name "*.zip" | wc -l)
slillibri
tentu, tetapi itu memiliki arti yang berbeda hanya ls /import/*.zipjika ada subdirektori
Mat
Saya mengatur maxdepth untuk menghindari penghitungan file dalam subdirektori dan memperbarui skrip untuk menggunakan -gt. Terima kasih atas bantuannya
Wallace Sean
Ini gagal jika ada terlalu banyak file dalam direktori untuk masuk dalam argv untuk permohonan ls.
Phil P
Ah benar Diperbaiki dengan findvarian.
Mat
0

Saya mencoba skrip Anda dan, seperti yang diharapkan, ketika tidak ada file yang cocok itu memang menampilkan 0 file dalam output, tetapi juga menunjukkan lskesalahan sebelumnya. Memecahkan ini cukup mudah, tidak perlu parit ls. Cukup ganti baris pertama dengan ini:

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

2>/dev/nullmengarahkan ulang stderr ke /dev/null, menekan pesan kesalahan.

Eduardo Ivanec
sumber