web-dev-qa-db-ja.com

ディレクトリ内の新しいファイルを監視し、それらを別のディレクトリに移動/名前変更するにはどうすればよいですか?

特定のプロセスが15回繰り返されるたびに、プログラムはoutput.txtという名前の出力テキストファイルを生成します。そうすると、最後のoutput.txtが上書きされます。ただし、ファイルを保持したいので、プログラム内でファイル名を変更することはできません。

プログラムと共に、出力ディレクトリを監視し、output.txtファイルを別のディレクトリに移動して名前を変更するスクリプトを実行できますか?

7
Sajid Iqbal

最初にパッケージinotify-toolsをインストールします。

Sudo apt-get install inotify-tools

Bashスクリプトが役立ちます

#! /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に移動し、日時のサフィックスを指定して名前を変更します。新しいファイルの場合、これは古いファイルを上書きしないように、このファイルが何時に作成されたかを知ることもできます

8
Maythux

以下のスクリプトは、定義されたディレクトリ(dr1)に表示される可能性のあるファイルを移動し、名前を変更します。 output_1.txt、output_2.txt`などのファイル名を変更します。ターゲット名が既にディレクトリ2に存在する場合(「ブラインド」選択範囲ではなく)、スクリプトは「アクティブ」に見えるため、開始および停止できます。既存のファイルを上書きするリスクなしにいつでもスクリプトを実行できます。

出力ファイルに一意の名前を付け、定義により既存のファイルを上書きしないため、ターゲットディレクトリcanはソースディレクトリと同じになります。

使い方

  • スクリプトを空のファイルにコピーし、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
Jacob Vlijm
  • パッケージをインストールします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
1
A.B.