Сценарій Bash для підрахунку кількості файлів


11

У мене є сценарій, і я хочу відображати різні повідомлення, якщо файл існує чи ні. У мене є такий сценарій, як:

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

Однак якщо файлів немає, це відображається No such file or directoryзамість 0 файлів. У каталозі є /import/каталог, тому я не можу просто виконати lsкоманду, оскільки це завжди поверне значення, що перевищує 0.

Як я можу підрахувати кількість файлів певного розширення (.zip, .gz тощо) та використовувати це значення у скрипті bash для відображення кількості файлів, а потім використовувати його у операторі if для відображення різних повідомлень?

Відповіді:


15

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


1
Я додав -maxdepth 1 лише для підрахунку файлів у поточному каталозі
Wallace Sean

1
Ви, ймовірно, хочете процитувати "* .zip" у випадку, якщо в поточному каталозі є будь-які .zip файли, коли це викликається, і в цьому випадку оболонка розширить * .zip для вас, тоді як ви хочете, щоб він пройшов, щоб знайти (1).
Філ П

4

Спробуйте з цим:

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

Ідея полягає в тому, щоб приховати помилку "немає такого файлу", яка надрукується на STDERR, надсилаючи її в бітбукет, і використовувати належну тестову функцію для порівняння чисел. ( -gtЧи означає «більше , ніж». Там же -eq, -lt, -geі т.д.)


Як альтернативу, ви також можете зробитиcount=$(find /import -type f -name "*.zip" | wc -l)
slillibri

звичайно, але це має інше значення, як тільки ls /import/*.zipякщо є підкаталоги
Мат

Я встановив maxdepth, щоб уникнути підрахунку файлів у підкаталогах та оновив сценарій до використання -gt. Дякуємо за допомогу
Уоллес Шон

Це не вдається, якщо в каталозі занадто багато файлів, щоб вони вміщувались у argv для виклику ls.
Філ П

Ага, правильно. Виправлено з findваріантом.
матч

0

Я спробував ваш сценарій і, як і слід було очікувати, коли ніякі файли не збігаються , що робить показати 0 файлів на виході, але і показує lsпомилку тільки раніше. Вирішити це досить просто, не потрібно викопувати канави ls. Просто замініть перший рядок цим:

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

2>/dev/nullперенаправляє stderr на /dev/null, пригнічуючи повідомлення про помилку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.