Como posso monitorar novos arquivos em um diretório e movê-los / renomeá-los em outro diretório?

5

Um programa gera arquivos de texto de saída, denominados output.txt , após cada 15 iteração de um determinado processo. Ao fazê-lo, substitui o último output.txt . Eu quero manter os arquivos no entanto, e não posso modificar o nome do arquivo dentro do programa.

Posso executar algum script, junto com o programa, que monitore o diretório de saída e mova e renomeie os arquivos output.txt para outro diretório?

    
por Sajid Iqbal 13.05.2015 / 04:11

3 respostas

7

Primeiro instale o pacote inotify-tools :

sudo apt-get install inotify-tools

Um script bash ajudaria

#! /bin/bash

folder=~/Desktop/abc

cdate=$(date +"%Y-%m-%d-%H:%M")

inotifywait -m -q -e create -r --format '%:e %w%f' $folder | while read file

  do
    mv ~/Desktop/abc/output.txt ~/Desktop/Old_abc/${cdate}-output.txt
  done

O que esse script significa:

Isto irá ver a pasta ~/Desktop/abc , então sempre que um arquivo for criado, ele moverá o arquivo localizado dentro do nome output.txt para o diretório ~/Desktop/Old_abc e renomeará o sufixo de data e hora do arquivo. novo arquivo, isso para ter certeza de não substituir arquivos antigos e, assim, você também pode saber que este arquivo foi criado em que hora e data

    
por Maythux 13.05.2015 / 09:20
3

O script abaixo moverá e renomeará qualquer arquivo que possa aparecer em um diretório definido ( dr1 ). Ele renomeia os arquivos como: output_1.txt , output_2.txt 'etc. O script parece "ativamente" se o nome de destino já existir no diretório 2 (não de um intervalo escolhido "cegamente"), para que você possa iniciar e parar o script a qualquer momento sem o risco de sobrescrever arquivos existentes.

Como ele fornece aos arquivos de saída um nome exclusivo e, por definição, não sobrescreve arquivos existentes, o diretório de destino pode ser o mesmo que o diretório de origem.

Como usar

  • Copie o script em um arquivo vazio, salve-o como rename_save.py
  • Etapa importante: na seção head, defina o intervalo de tempo para verificar novos arquivos. verifique se o intervalo de tempo é (muito) menor do que o intervalo em que os novos arquivos aparecem (o tempo que 15 iterações demoram) ou então novos arquivos serão criados antes de o último ser movido.
  • Além disso, na seção head, defina os caminhos para o diretório de origem e o diretório para o qual deseja salvar os arquivos renomeados.
  • Execute-o pelo comando:

    python3 /path/to/rename_save.py
    

    enquanto o outro script (iterativo) está sendo executado

O script

#!/usr/bin/env python3
import shutil
import os
import time

#--- set the time interval to check for new files (in seconds) below 
#    this interval should be smaller than the interval new files appear!
t = 1
#--- set the source directory (dr1) and target directory (dr2)
dr1 = "/path/to/source_directory"
dr2 = "/path/to/target_directory"

name = "output_"; extension = ".txt"
newname = lambda n: dr2+"/"+name+str(n)+extension

while True:
    newfiles = os.listdir(dr1)
    for file in newfiles:
        source = dr1+"/"+file
        n = 1; target = newname(n)
        while os.path.exists(target):
            n = n+1; target = newname(n)
        shutil.move(source, target)
    time.sleep(t)
    
por Jacob Vlijm 13.05.2015 / 07:16
1
  • Instale o pacote inoticoming

    sudo apt-get install inoticoming
    
  • Criar script de wrapper watch_output :

    #!/bin/bash
    backup_folder="$HOME/backups"
    
    filename=""
    
    mkdir -p "$backup_folder"
    
    if [ "$filename" == "output.txt" ]
    then
        echo "New or changed file \"output.txt\" in "
        mv "/$filename" "$backup_folder/${filename%.*}.$(date +'%Y-%m-%d_%H:%M:%S').${filename##*.}"
    fi
    
  • Torne-o executável:

    chmod +x <full_path_of_watch_output_script>
    
  • Assista sua pasta de saída de pasta:

    inoticoming "$HOME/output" <full_path_of_watch_output_script> {} "$HOME/output" \;
    

Exemplo:

$ killall inoticoming
$ inoticoming "$HOME/output" ./watch_output {} "$HOME/output" \;
$ touch $HOME/output/output.txt
$ ls -log $HOME/backups
total 0
-rw-rw-r-- 1 0 Mai 13 14:32 output.2015-05-13_14:32:10.txt
    
por A.B. 13.05.2015 / 14:17