Wie kann ich neue Dateien in einem Verzeichnis überwachen und in ein anderes Verzeichnis verschieben / umbenennen?

8

Ein Programm generiert output.txtnach jeder 15. Iteration eines bestimmten Prozesses Ausgabetextdateien, die benannt sind. Dabei wird der letzte überschrieben output.txt. Ich möchte die Dateien jedoch behalten und kann den Dateinamen im Programm nicht ändern.

Kann ich zusammen mit dem Programm ein Skript ausführen, das das Ausgabeverzeichnis überwacht und die output.txtDateien in ein anderes Verzeichnis verschiebt und umbenennt ?

Sajid Iqbal
quelle
1
Was meinst du mit Iterationen? Wenn dies Ihr benutzerdefiniertes Programm ist, ändern Sie es besser, damit es damit umgehen kann. Wenn Sie nicht wissen, wie Sie damit umgehen sollen, sollten Sie diese Frage zum Stapelüberlauf stellen.
Kos
Dieses Programm führt eine Schleife aus und speichert dann die Ausgabedatei. Ich brauche Dateimanager. Ich habe einen Hinweis und hoffe, dass es funktioniert. Danke für Ihre Aufmerksamkeit.
Sajid Iqbal

Antworten:

9

Installieren Sie zuerst das Paket inotify-tools:

sudo apt-get install inotify-tools

Ein Bash-Skript würde helfen

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

Was bedeutet dieses Skript:

Dadurch wird der Ordner überwacht. ~/Desktop/abcWenn also eine darin erstellte Datei erstellt wird, wird die darin erstellte Datei mit dem Namen output.txtin ein Verzeichnis ~/Desktop/Old_abcverschoben und mit einem Suffix aus Datum und Uhrzeit der neuen Datei umbenannt, um sicherzustellen, dass alte Dateien nicht überschrieben werden und so können Sie auch wissen, dass diese Datei zu welcher Zeit und zu welchem ​​Datum erstellt wurde

Maythux
quelle
3

Das folgende Skript verschiebt und benennt alle Dateien um, die möglicherweise in einem definierten Verzeichnis ( dr1) angezeigt werden. Die Dateien werden wie output_1.txtfolgt umbenannt : , output_2.txt` usw. Das Skript sieht "aktiv" aus, wenn der Zielname bereits in Verzeichnis 2 vorhanden ist (nicht aus einem "blind" ausgewählten Bereich), sodass Sie das Skript jederzeit starten und stoppen können ohne das Risiko, vorhandene Dateien zu überschreiben.

Da die Ausgabedateien einen eindeutigen Namen erhalten und vorhandene Dateien per Definition nicht überschrieben werden, kann das Zielverzeichnis mit dem Quellverzeichnis identisch sein.

Wie benutzt man

  • Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter rename_save.py
  • Wichtiger Schritt: Legen Sie im Kopfbereich das Zeitintervall fest, in dem nach neuen Dateien gesucht werden soll. Stellen Sie sicher, dass das Zeitintervall (viel) kürzer ist als das Intervall, in dem neue Dateien angezeigt werden (die Zeit, die 15 Iterationen benötigen). Andernfalls werden neue Dateien erstellt, bevor die letzte verschoben wird.
  • Legen Sie auch im Abschnitt head die Pfade sowohl zum Quellverzeichnis als auch zum Verzeichnis fest, in dem Sie die umbenannten Dateien speichern möchten.
  • Führen Sie es mit dem folgenden Befehl aus:

    python3 /path/to/rename_save.py

    während das andere (iterierende) Skript ausgeführt wird

Das Skript

#!/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)
Jacob Vlijm
quelle
2
  • Installieren Sie das Paket inoticoming

    sudo apt-get install inoticoming
  • Wrapper-Skript erstellen 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
  • Machen Sie es ausführbar:

    chmod +x <full_path_of_watch_output_script>
  • Beobachten Sie Ihren Ordnerausgabeordner:

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

Beispiel:

$ 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
AB
quelle