web-dev-qa-db-fra.com

Comment puis-je surveiller les nouveaux fichiers d'un répertoire et les déplacer / les renommer dans un autre répertoire?

Un programme génère des fichiers texte en sortie, nommés output.txt, après chaque 15ème itération d'un processus donné. Ce faisant, il écrase le dernier output.txt. Je souhaite cependant conserver les fichiers et je ne peux pas modifier le nom du fichier dans le programme.

Puis-je exécuter un script, avec le programme, qui surveille le répertoire de sortie, déplace et renomme les fichiers output.txt dans un autre répertoire?

7
Sajid Iqbal

Commencez par installer le paquet inotify-tools:

Sudo apt-get install inotify-tools

Un script bash aiderait

#! /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

Que signifie ce script:

Ceci surveillera le dossier ~/Desktop/abc ainsi chaque fois qu’un fichier créé à l’intérieur du fichier sera nommé output.txt dans un répertoire ~/Desktop/Old_abc et renommé en fournissant un suffixe de date et d’heure du nouveau fichier, ceci pour être sûr de ne pas écrasez les anciens fichiers et vous pourrez ainsi savoir que ce fichier a été créé à quelle heure et à quelle date

8
Maythux

Le script ci-dessous déplacera et renommera tout fichier pouvant apparaître dans un répertoire défini (dr1). Il renomme les fichiers tels que: output_1.txt, output_2.txt` etc. Le script a une apparence "active" si le nom ciblé existe déjà dans le répertoire 2 (et non dans une plage choisie "à l'aveuglette"). Vous pouvez ainsi démarrer et arrêter le script à tout moment. temps sans risque de remplacer les fichiers existants.

Etant donné qu’il attribue aux fichiers de sortie un nom unique et, par définition, ne remplace pas les fichiers existants, le répertoire ciblé peut est identique au répertoire source.

Comment utiliser

  • Copiez le script dans un fichier vide, enregistrez-le sous rename_save.py
  • Étape importante: dans la section de tête, définissez l'intervalle de temps pour rechercher de nouveaux fichiers. assurez-vous que l'intervalle de temps est (beaucoup) plus court que l'intervalle dans lequel les nouveaux fichiers apparaissent (la durée de 15 itérations), sinon de nouveaux fichiers seront créés avant que le dernier ne soit déplacé.
  • Toujours dans la section head, définissez les chemins d'accès au répertoire source et au répertoire dans lequel vous souhaitez enregistrer les fichiers renommés.
  • Exécutez-le à l'aide de la commande:

    python3 /path/to/rename_save.py
    

    pendant que l'autre script (itération) est en cours d'exécution

Le scénario

#!/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)
3
Jacob Vlijm
  • Installez le paquet inoticoming

    Sudo apt-get install inoticoming
    
  • Créer un script wrapper watch_output:

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

    chmod +x <full_path_of_watch_output_script>
    
  • Regardez votre dossier de sortie:

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

Exemple:

$ 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
1
A.B.