Я должен отследить время доступа папки и хотеть знать то, какие изменения внесены в него.
Как я инициировал те события? Существует ли способ выполнить определенный .sh файл, когда папка открыта?
Я предполагаю, что необходимо знать (часы-) время, папка открыта в, например, наутилус, не время, которое требуется для доступа к папке.
Можно получить список окна от команды wmctrl -l
, и посмотрите, происходит ли имя папки в списке. Цикл для проверки однако занял бы, по крайней мере, долю секунды, чтобы заметить, что папка открыта.
Вы имели бы 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:
(Следите за отступом!)
Из Ваших комментариев и обсуждения в чате, я понимаю, что Вы на самом деле ищете инструмент для входа доступа к папке (например, наутилусом) и изменения в содержании его.
Как дополнительная опция, всесторонний сценарий журнала, который записывает в двух различных потоках:
access_log.txt
access_log.txt
directory_log.txt
Эти события зарегистрированы два различных файла, потому что журналы имеют различные времена обновления. "Запись" в реальном времени того, что происходит с большим каталогом с большим количеством подкаталогов, не является чем-то, что Вы хотели бы быть сделанными каждые 5 секунд или около этого. Последствие то, что:
журнал каталога (добавляющий/удаляющий файлы) имеет точность 10 минут. О событиях сообщат в течение 10 минут после происходящий с точностью метки времени 10 минут.
Я протестировал его на (сеть-) каталог ~800 ГБ. Если Ваш каталог является значительно уменьшенным, журнал каталога - цикл может быть (намного) меньшим также. Я протестировал его, например, на каталоге на 20 ГБ, с (журнал каталога) цикл 10 секунд.
Пример произвел 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()
Если Вы хотите использовать Bash вместо этого Python:
#!/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 или удара, потому что оболочка определяется в первой строке сценария, например:
chmod u+x folderwatch.sh
./folderwatch.sh BackupSSD
sudo apt-get incron
устанавливать "inotify крон" система
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
В то время как это просто, и обманчиво так, синтаксис для сложных маневров является не совсем тем же как регулярным ударом, c.f., https://stackoverflow.com/questions/23706194/using-zenity-in-a-root-incron-job-to-display-message-to-currently-logged-in-user