フォルダーのアクセス時間を追跡する必要があり、どの変更が行われたかを知りたい。
これらのイベントをトリガーするにはどうすればよいですか?フォルダーを開いたときに特定の.shファイルを実行する方法はありますか?
私はあなたがフォルダが開かれている(時計)時間を知る必要があると仮定しますnautilus、フォルダへのアクセスにかかる時間ではなく。
コマンドwmctrl -l
からウィンドウリストを取得し、フォルダー名がリストにあるかどうかを確認できます。ただし、チェックするループは、フォルダーが開いていることを確認するのに少なくとも1秒かかります。
wmctrl
をインストールする必要があります。
Sudo apt-get install wmctrl
次の例では、スクリプトはフォルダーに初めてアクセスしたときにコマンドを実行し、終了します。
使用方法:
access_time.py
として保存します"<command_to_run>"
のヘッドセクションをコマンドで変更します(引用符の間)次のコマンドで実行します:
python3 </path/to/script> <foldername_without_path>
または、実行可能にした場合:
</path/to/access_time.py> <foldername_without_path>
#!/usr/bin/env python3
import subprocess
import sys
#--- replace "<command_to_run>" with your command (between quotes):
command = "<command_to_run>"
#---
foldername = sys.argv[1]
while True:
try:
test = subprocess.check_output(["wmctrl", "-l"]).decode("utf-8")
except subprocess.CalledProcessError:
pass
if foldername in test:
subprocess.call(["/bin/bash", "-c", command])
break
ただし、「オールインワン」で動作させることができるため、別のスクリプトは必要ありません。以下のスクリプトは、フォルダーにアクセスした時刻とともに$ HOMEディレクトリーにファイルを作成します。
#!/usr/bin/env python3
import subprocess
import sys
import os
import time
home = os.environ["HOME"]
foldername = sys.argv[1]
#--- the path your file is saved to (change if you want to, but use full paths)
path = home
#---
while True:
try:
test = subprocess.check_output(["wmctrl", "-l"]).decode("utf-8")
except subprocess.CalledProcessError:
pass
if foldername in test:
with open(path+"/time_data.txt", "a") as out:
out.write("the folder "+foldername+" was opened "+time.ctime()+"\n")
break
ファイル名の前にドットを置いて、隠しファイルにします(押します Ctrl+H 可視性を切り替えるには):
必要な場合は、変更します。
with open(path+"/time_data.txt", "a") as out:
に:
with open(path+"/.time_data.txt", "a") as out:
(インデントに注意してください!)
コメントとチャットでの議論から、フォルダへのアクセスをログに記録するツールを実際に探していることを理解しています(例:nautilusによる)およびその内容の変更。
追加オプションとして、2つの異なるスレッドで記録する包括的なログスクリプト:
access_log.txt
access_log.txt
directory_log.txt
にログインしたすべてのファイルログの更新時間が異なるため、これらのイベントは2つの異なるファイルに記録されます。多数のサブディレクトリを持つ大きなディレクトリで発生することをリアルタイムで「記録」することは、5秒ごとに実行したいものではありません。結果は次のとおりです。
directoryログ(ファイルの追加/削除)の精度は10分です。イベントは、発生後10分以内に報告され、タイムスタンプの精度は10分です。
〜800 GBの(ネットワーク)ディレクトリでテストしました。ディレクトリが非常に小さい場合、directoryログサイクルも(非常に)小さくなります。たとえば、10秒の(ディレクトリログ)サイクルで20 GBのディレクトリでテストしました。
出力例access_log.txt:
---------------Thu Feb 19 21:01:09 2015---------------
folder opened
---------------Thu Feb 19 21:01:27 2015---------------
folder closed
出力例directory_log.txt:
---------------Thu Feb 19 21:14:24 2015---------------
+ /home/jacob/Afbeeldingen/Downloads/2023.pdf
- /home/jacob/Afbeeldingen/Downloads/History-journal
- /home/jacob/Afbeeldingen/Downloads/google-earth-stable_current_i386.deb
上記のスクリプトのように設定します重要な違いあり:
それを実行するコマンドは次のとおりです。
python3 /path/to/script.py
#!/usr/bin/env python3
import subprocess
import os
import time
import difflib
from threading import Thread
home = os.environ["HOME"]
# The folder to watch:
folder = "/home/jacob/Afbeeldingen"
# the path your log files are saved to (change if you want to, but use full paths):
path = home
#---
for f in os.listdir(path):
if f.startswith("dr_check_"):
os.remove(path+"/"+f)
dr_data = path+"/directory_log.txt"
access_data = path+"/access_log.txt"
for f in [dr_data, access_data]:
if not os.path.exists(f):
subprocess.Popen(["touch", f])
foldername = folder.split("/")[-1]
def check_windowlist(foldername):
while True:
try:
if foldername in subprocess.check_output(["wmctrl", "-l"]).decode("utf-8"):
return "folder opened\n"
else:
return "folder closed\n"
break
except subprocess.CalledProcessError:
pass
def check_directory(directory, outfile):
with open(outfile, "wt") as out:
for root, dirs, files in os.walk(directory):
for f in files:
out.write(root+"/"+f+"\n")
def run_accesscheck():
while True:
ch1 = check_windowlist(foldername)
time.sleep(0.5)
ch2 = check_windowlist(foldername)
if ch1 != ch2:
with open(access_data, "a") as out:
out.write("-"*15+time.ctime()+"-"*15+"\n"+ch2+"\n")
def run_directorycheck():
last = 1; outfile_name = "dr_check_"; last_outfile = ""
while True:
outfile = path+"/"+outfile_name+str(last)+".txt"
check_directory(folder, outfile)
if last != 1:
changes = []
diff = difflib.ndiff(
open(last_outfile).readlines(),
open(outfile).readlines()
)
for item in diff:
if item.startswith("-") or item.startswith("+"):
changes.append(item)
if len(changes) > 0:
with open(dr_data, "a") as out:
out.write("-"*15+time.ctime()+"-"*15+"\n")
for it in sorted(changes):
out.write(it)
out.write("\n")
os.remove(last_outfile)
last_outfile = outfile; last = last+1
time.sleep(600)
Thread(target = run_directorycheck).start()
Thread(target = run_accesscheck).start()
Pythonの代わりにBashを使用する場合:
#!/bin/bash
folder=$1
while true;
do
command=$(wmctrl -l | grep -o "$folder")
if [[ "$folder" == "$command" ]];
then
./myscript.sh
break;
fi
done
編集:
次のコマンドで実行できるようにスクリプトを変更しました。
bash folderwatch.sh BackupSSD
また、シェルはスクリプトの最初の行で定義されているため、スクリプトを実行可能にしてshまたはbashなしで使用できます。
chmod u+x folderwatch.sh
./folderwatch.sh BackupSSD
Sudo apt-get incron
「inotify cron」システムをインストールする
http://inotify.aiken.cz/?section=incron&page=about&lang=en
echo $USER | Sudo tee --append /etc/incron.allow
あなたがゲームをプレイできるようにします。
icrontab -e
視聴するイベントを作成します。 nano
が開きます。
あなたの心の願いを入力してください。例えば。、
/home/nodak/watched_dir IN_ACCESS /home/nodak/bin/personal.sh
保存してテストします。
http://manpages.ubuntu.com/manpages/saucy/man5/incrontab.5.html からの詳細情報
それは単純で、一見そうですが、複雑な操作の構文はregularbash、cf、 https:/ /stackoverflow.com/questions/23706194/using-zenity-in-a-root-incron-job-to-display-message-to-currently-logged-in-user