Как я могу отслеживать новые файлы в каталоге и перемещать / переименовывать их в другой каталог?

Программа генерирует выходные текстовые файлы с именем output.txt после каждой 15-й итерации определенного процесса. При этом он перезаписывает последний output.txt. Однако я хочу сохранить файлы и не могу изменить имя файла в программе.

Можно ли запустить какой-нибудь сценарий вместе с программой, которая контролирует выходной каталог, перемещает и переименовывает файлы output.txt в другой каталог?

7
задан 13 May 2015 в 08:33

3 ответа

Сначала установите пакет inotify-tools:

sudo apt-get install inotify-tools

сценарий удара А помог бы

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

, Что делает это средство сценария:

Это будет наблюдать папку ~/Desktop/abc поэтому каждый раз, когда файл создал внутри затем, это собирается переместить файл, основанный внутри, который является именем output.txt к каталогу ~/Desktop/Old_abc, и переименуйте обеспечение суффикса даты и времени t он новый файл, это, чтобы убедиться не перезаписать старые файлы, и как этот можно также знать, что этот файл был создан в во сколько и дата

8
ответ дан 13 May 2015 в 18:33
  • 1
    Получил это: /etc/systemd/system/multi-user.target.wants/nfs-server.service . – Svetlana Belkin 8 September 2016 в 07:14
  • Установка пакет inoticoming

    sudo apt-get install inoticoming
    
  • Создают сценарий 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
    
  • Делают его исполняемым файлом:

    chmod +x <full_path_of_watch_output_script>
    
  • Часы Ваша папка произвела папку:

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

Пример:

$ 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
0
ответ дан 13 May 2015 в 08:33

Сценарий ниже переместит и переименует любой файл, который мог бы появиться в определенном каталоге (dr1). Это переименовывает файлы как: output_1.txt, output_2.txt' и т.д. Сценарий смотрит "активно", если целенаправленное имя уже существует в каталоге 2 (не от "вслепую" выбранного диапазона), таким образом, можно запустить и остановить сценарий в любое время без риска перезаписи существующих файлов.

, Так как это дает выходным файлам уникальное имя и по определению не перезаписывает существующие файлы, целенаправленный каталог может совпасть с исходным каталогом.

, Как использовать

  • Копия сценарий в пустой файл, сохраните его как rename_save.py
  • Важный шаг: в главном разделе, набор временной интервал для проверки на новые файлы. удостоверьтесь, что временной интервал (намного) короче, чем интервал, в котором появляются новые файлы (время, которое 15 повторений занимают), или иначе новые файлы будут созданы, прежде чем последний перемещен.
  • Также в главном разделе, установленном пути и к исходному каталогу и к каталогу, Вы хотите сохранить переименованные файлы к.
  • Выполнение это командой:

    python3 /path/to/rename_save.py
    

    , в то время как другой (итерация) сценарий работает

сценарий

#!/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
ответ дан 13 May 2015 в 18:33
  • 1
    таким образом, у Вас есть сценарий для запуска его, что происходит, если Вы выполняете команду systemctl для запуска его? – Amias 8 September 2016 в 22:22

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

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