скрипт конвертирует файлы using dos2unix [closed]

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

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

Что у меня есть:

while true
do    
    dos2unix //path_to_folder/frm*    
done

Есть помощь? Спасибо!

1
задан 24 October 2014 в 21:52

2 ответа

Прием должен проверить содержание папки в определенных интервалах и сравнить список файлов с последней проверкой. Так как только новые файлы должны быть преобразованы, файлы, которые уже были в списке, прошлый раз может быть пропущен.

, Именно это ниже делает сценарий. Это находится в 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
1
ответ дан 11 November 2019 в 12:32

Хрупкий способ использовать 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 строка, которая, как гарантируют, не появится в имени файла.
0
ответ дан 11 November 2019 в 12:32

Другие вопросы по тегам:

Похожие вопросы: