Скрипт bash с бесконечным циклом для проверки и обработки файла - PullRequest
1 голос
/ 17 октября 2019

Я пишу сценарий Bash, который ищет файл, соответствующий заданному шаблону в каталоге, и при обнаружении выполняет дополнительную обработку.

#!/bin/sh
set -eu

INTERVAL=5
DIRECTORY=/home/methuselah
PATTERN=(MT*xx.txt)

while :
do 
  if [[ -e "$DIRECTORY/$PATTERN" ]]; then
    echo "File has arrived. Starting processing..."
    # Not sure about this!
    for file in "$DIRECTORY/$PATTERN"; do
      echo "foo" > "$file"
    done
  fi
  echo "Waiting for file..."
  sleep $INTERVAL
done

Прямо сейчас вышеприведенный скрипт ничего не делает, даже когда файл сбрасывается в каталог. Как я могу это исправить? И во-вторых, когда файл поступил в каталог, могу ли я вывести имя?

Обновление

#!/bin/bash
set -u

INTERVAL=5
DIRECTORY=/home/methuselah
PATTERN=(MT*xx.txt)

while :
do 
  if [[ -e $DIRECTORY/$PATTERN ]]; then
    echo "File has arrived. Starting processing..."
    # How do you print the file name out here?
  fi
  echo "Waiting for file..."
  sleep $INTERVAL
done

1 Ответ

3 голосов
/ 17 октября 2019

Будьте в курсе имен файлов, которые содержат пробелы! Самый простой способ, которым я знаю, чтобы справиться с этим, это поместить каждый элемент в массив и затем выполнить итерацию массива:

#!/bin/bash

declare -i interval=5
declare    directory="/home/methuselah"
declare    pattern="MT*xx.txt"    # ${pattern} should not have any spaces.

shopt -s nullglob      # ${pattern} expands to NULL string when no match.
while dirents=( "${directory}"/${pattern} ); do    # Don't quote ${pattern}
  for dirent in "${dirents[@]}"; do    # Quotes keep array elements intact.
    if [ -f "${dirent}" ]; then
      echo "Processing file: '${file}',"
      # Do something to "${file}". Always use quotes.
    fi
  done
  echo "Waiting for file..."
  sleep ${interval}
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...