Назад | Перейти на главную страницу

Bash-скрипт для подсчета количества файлов

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

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 для отображения разных сообщений?

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

Попробуйте с этим:

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

Идея состоит в том, чтобы скрыть ошибку «нет такого файла», которая печатается в STDERR, отправив ее в битовый пакет, и использовать правильную функцию проверки для сравнения чисел. (-gt означает «больше». Есть также -eq, -lt, -ge, и т.д.)

Я попробовал ваш скрипт и, как и ожидалось, когда файлы не совпадают, он делает показывает 0 файлов на выходе, но также показывает ls ошибка только перед. Решить это довольно просто, не нужно отказываться от ls. Просто замените первую строку на это:

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

2>/dev/null перенаправляет stderr на /dev/null, подавление сообщения об ошибке.