程序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