2016-04-19 20 views
0

Я использую fswatch, чтобы отслеживать изменения в каталоге, но хотел бы, чтобы этот процесс остановился, если существует определенный файл (с подстановочным знаком). Этот определенный файл создается в альтернативном каталоге (не в отслеживаемой директории) другим процессом (который генерирует изменения, которые необходимо отслеживать).Остановить просмотр папки для изменений, если файл существует (bash)

Вот что я пытался сделать:

while [[ $(shopt -s nullglob; set -- "${file_to_check}"; echo $#) -eq 1 ]]; do 
    fswatch "${path_to_the_tracked_directory}" 
done && echo "Done" 

Однако этот сценарий не завершается после того, как ${file_to_check} появляется.

Комплекс бит в состоянии, чтобы заботиться о групповых символов в соответствии с: Bash check if file exists with double bracket test and wildcards

РЕДАКТИРОВАТЬ:

Комплекс бит может быть упрощено до:

while [ $(set -- "${path_to_the_file_to_check}"${file_to_check_with_wildcards}; echo $#) -eq 0 ]; do 
    fswatch "${path_to_the_tracked_directory}" 
done && echo "Done" 
+0

Вы переписали код неправильно. Должно быть пространство после 'set --' – tripleee

+0

Кроме того, двойное цитирование шаблона означает, что вы можете просто использовать' while! [-f "$ file_to_check"] '- код, на который вы ссылаетесь, предназначен для проверки того, соответствует ли подстановочный знак точно одному файлу, в отличие от нуля или нескольких. С одним статическим именем файла и без подстановочных знаков это, очевидно, серьезный перебор. – tripleee

+0

@tripleee: Спасибо, на самом деле моя первая попытка была 'while [! -f "$ {file_to_check}"] ', но он не работает с подстановочными знаками. – econ

ответ

0

Одно из решений состоит в использовании -1/--one-event опция (https://github.com/emcrisostomo/fswatch/wiki/How-to-Use-fswatch).

Затем код выглядит так:

while [ $(set -- "${path_to_the_file_to_check}"${file_to_check_with_wildcards}; echo $#) -eq 0 ]; do 
     fswatch -1 "${path_to_the_tracked_directory}" 
done && echo "Done"