Tập lệnh Bash để đếm số lượng tập tin


11

Tôi có một tập lệnh và tôi muốn hiển thị các thông báo khác nhau nếu một tập tin tồn tại hay không. Tôi có một kịch bản như:

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

Tuy nhiên, nếu không có tệp nào tồn tại, thì tệp này hiển thị No such file or directorythay vì 0 tệp. Có một thư mục trong /import/thư mục, vì vậy tôi không thể thực hiện một lslệnh vì nó sẽ luôn trả về giá trị lớn hơn 0.

Làm cách nào tôi có thể đếm số lượng tệp của một tiện ích mở rộng cụ thể (.zip, .gz, v.v.) và sử dụng giá trị đó trong tập lệnh bash để hiển thị số lượng tệp và sau đó sử dụng nó trong câu lệnh if để hiển thị các thông báo khác nhau?

Câu trả lời:


15

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


1
Tôi đã thêm -maxdepth 1 để chỉ đếm các tệp trong thư mục hiện tại
Wallace Sean

1
Bạn có thể muốn trích dẫn '* .zip' trong trường hợp có bất kỳ tệp .zip nào trong thư mục hiện tại khi được gọi, trong trường hợp đó, shell sẽ mở rộng * .zip cho bạn, trong khi bạn muốn nó đi qua để tìm (1).
Phil P

4

Hãy thử với điều này:

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

Ý tưởng là để ẩn lỗi "không có tệp như vậy" được in ra STDERR bằng cách gửi nó đến bitbucket và sử dụng chức năng kiểm tra thích hợp để so sánh các số. ( -gtViết tắt của "lớn hơn". Ngoài ra còn có -eq, -lt, -ge, vv)


Thay thế, bạn cũng có thể làmcount=$(find /import -type f -name "*.zip" | wc -l)
slillibri

chắc chắn, nhưng điều đó có một ý nghĩa khác với chỉ ls /import/*.zipkhi có các thư mục con
Mat

Tôi đặt maxdepth để tránh đếm các tệp trong thư mục con và cập nhật tập lệnh để sử dụng -gt. Cảm ơn sự giúp đỡ
Wallace Sean

Điều này không thành công nếu có quá nhiều tệp trong thư mục phù hợp với argv cho lệnh gọi ls.
Phil P

À, đúng rồi. Sửa chữa với một findbiến thể.
Mat

0

Tôi cố gắng kịch bản của bạn và, như mong đợi, khi không có file được kết hợp nó không hiển thị 0 tập tin trong đầu ra, nhưng cũng cho thấy lslỗi ngay trước. Giải quyết điều này khá dễ dàng, không cần phải bỏ qua ls. Chỉ cần thay thế dòng đầu tiên bằng điều này:

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

2>/dev/nullchuyển hướng stderr đến /dev/null, chặn thông báo lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.