Проверяет наличие файла в другом месте, а затем копирует файлы на основе условия в Unix

#shell #unix #sh

#оболочка #unix #sh

Вопрос:

Существует папка, в которую пользователи помещают файлы в произвольное время. Все эти файлы доступны только для чтения. Нам нужно читать файлы каждый час, и если за последний час есть файл, нам нужно скопировать его (не удалять или изменять) в другой каталог. Файлы обычно имеют шаблон Bank_YYMMDD.csv, где YYMMDD является переменной, например: Bank_20200927.csv.

/outbound — это место, где размещаются файлы, а /daily — это место, куда файлы должны быть скопированы. Я попробовал приведенный ниже код, и он работает нормально.

 find /outbound -type f -mmin -60 -name "Bank*" | xargs -ILIST cp LIST /daily/
  

Проблемная часть:
Как только файлы помещаются в / daily, отдельный бизнес-процесс проверяет и обрабатывает эти файлы и после обработки перемещает их в /processed .
Существует дополнительное требование для проверки обработанной папки, т. е. /processed, и если файл, который мы пытаемся поместить, уже существует в папке /processed, тогда не копируйте этот файл в /ежедневно.

Пример: за последний час в / outbound были размещены или изменены 3 файла, скажем, 3 файла: Bank_20200927.csv, Bank_20200926.csv и Bank_20200925.csv. Из этих 3 файлов процесс выполнялся ранее и уже выбрал Bank_20200926.csv и Bank_20200925.csv и поместил их в /daily . Затем бизнес-процесс запустился, и в папке now / processed уже есть Bank_20200926.csv и Bank_20200925.csv.

Таким образом, на этот раз, несмотря на то, что Bank_20200926.csv и Bank_20200925.csv были выбраны по мере их изменения и удовлетворяют проверке «изменено за последний час», единственным файлом, который будет скопирован в папку /daily, будет Bank_20200927.csv.

Я застрял с частью, чтобы проверить, есть ли у /processed файлы, и если нет, то поместите его в /daily .

Пожалуйста, помогите.

Заранее спасибо.

Ответ №1:

Можно использовать что-то подобное :

 for i in /outbound/*.csv;do [[ $(($(date  "%s")-$(stat -c %Y $i))) -lt 3600 amp;amp; ! -e /processed/${i##*/} ]] amp;amp; cp $i /daily/;done
  

Комментарии:

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

2. Оператор date предназначен только для проверки того, что файлам меньше 60 минут.

3. Я просто меняю путь к файлу, шаблон имени файла и время на приведенные ниже. для i в /interfaces/sftp/output/»Bank*»;выполните [[ $(($(date «%s»)-$(stat -c %Y $i))) -lt 900 amp;amp; ! -e /interfaces/file/archive/${я ## */} ]] amp;amp; cp $i /interfaces/file/in/;готово, я сохранил его как скрипт .sh и попытался запустить его через командную строку ОС. Однако это ничего не делает. Это не дает мне никаких ошибок, но и ничего не делает. У меня был файл /interfaces/sftp/output/Bank_20200928.csv, но /interfaces/file/in/ остается пустым.

4. Обновить. Функция копирования работает после того, как я убрал звездочку из «», т.е. /interfaces/sftp/output/»Bank»* вместо /interfaces/sftp/output/»Bank*»