Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD
Представлю вам скрипт, который архивирует файл, если он есть в заданной директории. Если файла нет — архив не создается.
#Задаем переменную директории
DIR=/home/user/data
#Если в директории имеются файл. Ключ -f проверяет наличие файлов.
if [ -f $DIR/1.txt ];
# архивируем этот файл
then
cd $DIR
tar -cpf archive.tar 1.txt
#если файлов нет — выдается сообщение
else
echo “Нет файла”
fi
Остальные ключи проверки файлов/каталогов:
-s проверка, является ли файл пустым
-x проверка исполняемости файла
-d проверка существования каталога
Второй вариант bash-скрипта для проверки условия существования файлов и их архивирования при наличии:
if A=$(find . -name «*.txt» -exec echo -n «1» \; ); [ «$A» = «» ]
then
echo “Нет файлов”
else
tar -cpf archive.tar *.txt
fi
Третий вариант проверки условия существования любых файлов в каталоге:
#Задаем переменную директории
DIR=/000/test/test
#вычисляем количество файлов, которые есть в заданной директории
filecount=`find $DIR -type f | wc -l`
#если количество файлов равно нулю, то есть их нет, то выдается сообщение
if [ $filecount -eq 0 ];
then
echo «Файлов нет, выполняем скрипт дальше»
else
echo «Есть файлы, прекращаем работу скрипта» && exit
fi
Четвертый вариант проверки условия существования любых файлов в каталоге с бесконечным циклом:
#Задаем переменную директории
DIR=/000/test/test
while true
do
case `find $DIR -type f | wc -l` in
0 ) echo «no file» ;; #Если файлов нет — выводится сообщение (или можно подставить любой ваш скрипт или команду)
* ) sleep 5 ;; #если файлы в каталоге есть — ждем 5 секунд и дальше проверяем по-новому (к первому шагу)
esac
done
exit 0
День добрый.
Подскажите, а как будет выглядеть скрипт, который не даст дальнейшее выполнение основного скрипта, пока в указанном каталоге присутствуют файлы (любые), с любым именем и расширением?
Алексей, я добавил в статью вариант под вашу нужду. Пойдет?
Третий вариант, я думаю тоже возьму на заметку, но
если можно покажите пример, в котором бы
был как я понимаю бесконечный цикл проверки на наличия файлов.
То есть почти как третий вариант, только если файлы есть, то работа скрипта не прекращалась вообще, а допустим был бы sleep 5 и после него проверка повторялась и так до тех пор пока каталог не будет пустым и только тогда пойдёт выполнение скрипта далее.
Четвертый вариант пойдет? Я проверил — работает так, как вам нужно, если я правильно понял.
То что надо!
Спасибо
Не могу понять, пишу это на роутере.
Под sh выполняется всё корректно find $DIR -type f | wc -l,
а когда сам роутер выполняет эту команду, то почему то
она всё время пишет ноль файлов в каталоге, хотя они там есть.
Если быть точнее, то пишу скрипт:
filecount=`find /opt/var/spool/sms/failed/ -type f | wc -l`
echo -e $filecount >> /tmp/status
если данный скрипт выполнить под ssh, то всё ок, а если
его выполняет cron, то всё время получаю ноль.
Вроде разобрался, указал до команды find полный путь.