script converte arquivos usando dos2unix [closed]

1

Eu quero criar um script para monitorar minha pasta local e toda vez que receber um arquivo que comece com frm* , para convertê-lo usando dos2unix .

Esse script está sempre em execução e continua convertendo os mesmos arquivos, que já foram convertidos, então acho que isso pode ser possível uma melhoria.

O que eu tenho agora:

while true
do    
    dos2unix //path_to_folder/frm*    
done

Qualquer ajuda? Obrigado!

    
por DJames 24.10.2014 / 18:28

2 respostas

1

O truque é verificar o conteúdo da pasta em determinados intervalos e comparar a lista de arquivos com a última verificação. Como apenas novos arquivos precisam ser convertidos, os arquivos que já estavam na lista na última vez podem ser ignorados.

É isso que o script abaixo faz. É em python, mas o princípio é o mesmo em qualquer idioma.

O que faz:

Quando o script é iniciado, ele cria uma lista de arquivos no diretório.
Então, em um loop, a cada 5 segundos:

  • verifica arquivos adicionais
  • se arquivos adicionais forem encontrados, eles serão convertidos, os arquivos que já estavam lá serão ignorados.
  • define a última lista de arquivos verificados como a "nova" lista inicial de arquivos.
#!/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)

Copie o script em um arquivo vazio, defina o caminho para sua pasta, salve-o como convert.py e execute o script em segundo plano pelo comando:

python3 /path/to/convert.py
    
por Jacob Vlijm 24.10.2014 / 19:25
0

Uma forma frágil usando inotifywait e 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

Notas:

  • Você precisa instalar o inotify-tools :

    sudo apt-get install inotify-tools
    
  • Observa apenas o evento close_write , portanto dos2unix aconteceria depois que o processo que criou ou modificou o arquivo foi fechado.

  • Você também pode assistir ao diretório recursivamente usando a opção -r .
  • inotifywait tem uma opção --exclude que aceita expressões regulares estendidas POSIX, mas negar uma regex (tudo exceto frm ) é complicado e mais facilmente feito em awk .
  • Isso será interrompido se os nomes dos arquivos contiverem uma vírgula , . Escolha um delimitador na string --format , que é garantido não aparecer em um nome de arquivo.
por muru 24.10.2014 / 20:30