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 только для подсчета файлов в текущем каталоге
Уоллес Шон
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, подавляя сообщение об ошибке.

Эдуардо Иванец
источник