Я хочу создать сценарий для мониторинга моей локальной папки и каждый раз, когда он получает файл, начинающийся с frm *
, преобразовывать его с помощью dos2unix
.
Этот скрипт всегда работает и продолжает преобразовывать одни и те же файлы, которые уже преобразованы, поэтому я думаю, что это может быть улучшением.
Что у меня есть:
while true
do
dos2unix //path_to_folder/frm*
done
Есть помощь? Спасибо!
Прием должен проверить содержание папки в определенных интервалах и сравнить список файлов с последней проверкой. Так как только новые файлы должны быть преобразованы, файлы, которые уже были в списке, прошлый раз может быть пропущен.
, Именно это ниже делает сценарий. Это находится в Python, но принцип является тем же на любом языке.
, Что это делает:
, Когда сценарий инициирует, он входит в список файлов в каталоге.
Затем в цикле, каждые 5 секунд:
#!/usr/bin/env python3
import subprocess
import time
directory = "/path/to/your/files"
def current_files():
read = subprocess.check_output(["ls", directory]).decode("utf-8").strip()
return [item for item in read.split("\n")]
initial_files = current_files()
while True:
update = current_files()
for item in update:
if (item in initial_files, item.startswith("frm")) == (False, True):
subprocess.call(["/bin/bash", "-c", "dos2unix", directory+"/"+item])
initial_files = update
time.sleep(5)
Копия сценарий в пустой файл, установленный путь к Вашей папке, сохраняет его как convert.py
и выполняет сценарий в фоновом режиме командой:
python3 /path/to/convert.py
Хрупкий способ использовать inotifywait
и awk
:
#!/bin/bash
DIR="/path/to/folder"
while FILE="$(inotifywait '$DIR' -e close_write --format '%e,%f' | awk -F, '$NF ~ /^frm/{print $NF}')"
do
echo $FILE;
if [[ -f $FILE ]]
then
dos2unix "$DIR/$FILE"
fi
done
Примечания:
Необходимо установить inotify-tools
:
sudo apt-get install inotify-tools
Это смотрит только close_write
событие, таким образом, dos2unix
произошел бы после того, как процесс, который создал или изменил его, закрыл файл.
-r
опция.inotifywait
имеет --exclude
опция, которая принимает расширенные регулярные выражения POSIX, но отрицание regex (все кроме frm
) является сложным и более легко выполнен awk
.,
. Выберите разделитель в --format
строка, которая, как гарантируют, не появится в имени файла.