如何监视目录中的新文件并将其移动/重命名到另一个目录?

如何监视目录中的新文件并将其移动/重命名到另一个目录?

程序output.txt在某个过程每 15 次迭代后生成名为 的输出文本文件。这样做会覆盖最后一个output.txt。但是我想保留这些文件,并且无法在程序中修改文件名。

我可以与程序一起运行一些脚本来监视输出目录并将output.txt文件移动并重命名到另一个目录中吗?

答案1

首先安装包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中,并重命名,并提供新文件的日期和时间后缀,这样可以确保不会覆盖旧文件,这样你还可以知道这个文件是在什么时间和日期创建的

答案2

下面的脚本将移动和重命名可能出现在已定义目录 ( 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

  • 安装包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

相关内容