2013-03-17 8 views
3

Я пишу сценарий оболочки. Мне нужно проверить конкретный каталог для существования файлов с 2-мя конкретными расширениями файлов «eob» и «inp», а если существует, я хочу остаться в цикле и продолжать проверять до тех пор, пока файлы не будут существовать, тогда я хочу выйти из своего цикла и продолжайте с остальной частью логики.Unix Shell Scripting - Loop до тех пор, пока файлы не будут найдены

Ниже приведен код, у меня до сих пор, но это не работает ...

while true 
do 
    [ ! find /home/mpcmi/cm -type f \(-name "*.eob" -o -name "*.inp" \) ] && break 
    echo "eob or inp file exists" 
    sleep 2 
done 
echo "eob or inp file doesn't exists" 

Во-первых, я получаю эту ошибку при запуске скрипта:

"/home/mpcmi/cm: unknown test operator" 

Во-вторых, проверяет и находит файлы с этими расширениями правильно, я полагаю, потому что получаю вывод: «существует файл eob или inp», однако, когда я удаляю свои тестовые «eob» и «inp» файлы, скрипт, похоже, не обнаруживает его, он прекращает печать «eob или inp-файл существует», но он никогда не печатает «eob или inp-файл не существует»

Ниже весь выходной, то он просто останавливается после того, как я удаляю тест «EOB» и «INP» файлы:

employees_load.sh[9]: /home/mpcmi/cm: unknown test operator 
eob or inp file exists 
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator 
eob or inp file exists 
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator 
eob or inp file exists 
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator 
eob or inp file exists 
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator 
eob or inp file exists 
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator 
eob or inp file exists 
employees_load.sh[9]: /home/mpcmi/cm: unknown test operator 
eob or inp file exists 

Может кто-то помочь?

Спасибо!

ответ

0

Эти отпечатки существуют, если файл с .inp или .eob существует и не существует в противном случае.

if ls *.inp || ls *.eob 
then 
    echo "exists" 
else 
    echo "does not exist" 
fi 
1

Вы не указали, какую оболочку вы используете. Я предполагаю, что это баш.

  1. Вы должны использовать '[[' и ']]' вместо '[' и ']' для оценки того, пуст или нет результат команды find.
  2. Вы должны использовать команду `` вокруг команды 'find' для выполнения и подачи результата в вышеприведенную оценку.

Вот модифицированный скрипт:

while true 
do 
    [[ ! `find /home/smb -type f \(-name "*.eob" -o -name "*.inp" \)` ]] && break 
    echo "eob or inp file exists" 
    sleep 2 
done 
echo "eob or inp file doesn't exists" 
1

Предполагая bash и что файлы не находятся в подкаталоге

shopt -s nullglob 
while true; do 
    unset f 
    f=(/home/mpcmi/cm/*.{eob,inp}) 
    if ((${#f[@]} > 0)); then 
     echo "${#f[@]} eob or inp files present" 
     sleep 2 
    else 
     break 
    fi 
done 
echo "no eob or inp files" 
0

Только в Баш, без создания суб-процесса в цикле:

check_dir=/home/mpcmi/cm 

my_tmp_dir=$(mktemp -d --tmpdir=/tmp) # Create a unique tmp dir for the fifo. 
mkfifo $my_tmp_dir/fifo     # Empty fifo for sleep by read. 

found=1 
while [[ $found == 1 ]]; do 
    found=0 
    for f in $check_dir/*.inp $check_dir/*.eob; do 
    [[ -e $f ]] && found=1 && break 
    done 
    read -t 1 <> $my_tmp_dir/fifo   # Same as sleep 1, but without sub-process. 
done 

rm $my_tmp_dir/fifo; rmdir $my_tmp_dir # Cleanup, could be done in a trap. 

Обход sleep в цикле, я не создаю никаких подпроцессов, поэтому я сохраняю системные ресурсы. Чтобы достичь этого, я должен реализовать свой собственный sleep в bash, и я нашел только read с таймаутом на fifo.

Вы можете улучшить этот скрипт, используя trap для очистки.

0

Упростите вашу логику:

while find /home/mpcmi/cm -type f \(-name "*.eob" -o -name "*.inp" \) | 
    grep -q . ; do 
    echo "eob or inp file exists" 
    sleep 2 
done 
echo "No extant eob or inp files" 
+0

Спасибо всем за Свои замечания! Вопрос - как мне заставить его просматривать только каталог/home/mpcmi/cm и НЕ переходить к подкаталогам? Спасибо! – user2179092

Смежные вопросы