У меня есть сценарий, и я хочу отображать разные сообщения, существует ли файл или нет. У меня есть сценарий вроде:
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
, подавление сообщения об ошибке.