Я запускаю Ubuntu 14.04, и я хочу контролировать папку и отбросить почту, если новые файлы не добавляются каждые 30 минут.
Я относился ниже также.
Как я могу контролировать новые файлы в каталоге и переместиться/переименовать их в другой каталог?
Я не уверен, как ожидать в течение периода и проверки на новые файлы в папке.
Вы смогли делать что-то столь же простое как:
#!/bin/bash
targetDir="$1"
while true; do
files=("$targetDir"/*)
sleep 30m ## wait 30 minutes
files1=("$targetDir/"*)
if [[ ${#files[@]} == ${#files1[@]} ]]; then
echo "No new files added" | mail user@example.com
fi
done
Сохраните тот сценарий как ~/bin/watch.sh
или независимо от того, что Вам нравится, сделайте это исполняемым файлом (chmod a+x ~/bin/watch.sh
) и выполненный это дающий его целевой каталог как аргумент:
watch.sh /path/to/dir
Теперь, это - очень наивный подход и просто считает количество файлов каждые 30 минут. Таким образом, если один файл будет удален, но другой добавил, то он будет думать, что нет никаких новых файлов. Это, вероятно, была бы лучшая идея взять метку времени новейшего файла и проверки, если бы это было в последний раз изменено больше чем 30 минут назад:
#!/bin/bash
targetDir="$1"
newest=0;
while true; do
## Wait for half an hour. This is done at the beginning of the loop
## to ensure we wait a half hour before the first check
sleep 30m
## Get the current time in seconds since the epoch
now=$(date '+%s')
for file in "$targetDir"/*; do
## Get the file's modification time in seconds since the epoch
lastMod=$(stat -c "%Y" "$file")
## Is this file newer than the current newest?
if [[ $lastMod -gt $newest ]]; then
newest=$lastMod
fi
done
## If the newest file is older than half an hour
if [[ $((now - newest)) -gt 1800 ]]; then
echo "No new files added since $(date -d '- 30 min')" |
mail user@example.com
fi
done
Если Вы не хотите запускать скрипт навсегда как этот, Вы могли бы вместо этого записать тот, который проверяет метки времени, и называйте сценарий каждые 30 минут:
#!/bin/bash
targetDir="$1"
newest=0;
for file in "$targetDir"/*; do
## Get the file's modification time in seconds since the epoch
lastMod=$(stat -c "%Y" "$file")
## Is this file newer than the current newest?
if [[ $lastMod -gt $newest ]]; then
newest=$lastMod
fi
done
## Get the current time in seconds since the epoch
now=$(date '+%s')
## If the newest file is older than half an hour
if [[ $((now - newest)) -gt 1800 ]]; then
echo "No new files added since $(date -d '- 30 min')" |
mail user@example.com
fi
Теперь, сохраните это как ~/bin/watch.sh
и сделайте это исполняемым файлом (chmod a+x ~/bin/watch.sh
). Затем выполненный crontab -e
и добавьте эту строку:
*/30 * * * * /home/techie/bin/watch.sh
Сохраните файл (сохранение добавляет crontab), и Вы сделаны. Скрипт будет запускаться каждые 30 минут.
Прежде, чем проверить на новые файлы, я использовал бы "статистику" на самом каталоге и видел бы, изменяется ли метка времени.
$ stat $PWD
File: ‘/home/paulm/SCRATCH’
Size: 6144 Blocks: 8 IO Block: 32768 directory
Device: 26h/38d Inode: 10937103831396301849 Links: 6
Access: (0775/drwxrwxr-x) Uid: ( 520/ paulm) Gid: ( 1020/ paulm)
Access: 2019-07-09 13:17:15.528000000 +0000
Modify: 2019-07-09 13:17:15.528000000 +0000
Change: 2019-07-09 13:17:15.528000000 +0000
Birth: -
$ touch bar
$ stat $PWD
File: ‘/home/paulm/SCRATCH’
Size: 6144 Blocks: 8 IO Block: 32768 directory
Device: 26h/38d Inode: 10937103831396301849 Links: 6
Access: (0775/drwxrwxr-x) Uid: ( 520/ paulm) Gid: ( 1020/ paulm)
Access: 2019-07-09 13:23:11.346000000 +0000
Modify: 2019-07-09 13:23:11.346000000 +0000
Change: 2019-07-09 13:23:11.346000000 +0000
Birth: -
если дата на изменениях каталога, то стоит искать новые файлы, это должно быть намного более эффективно.
Ответы до сих пор предполагают, что файлы только входят в каталог и никогда не выходят. Но что, если у Вас есть сценарий, который периодически освобождает каталог? Затем сценарий мог пропустить факт, файл вошел в каталог 5 несколько минут назад, но был обработан и вынут.
Другая опция использует inotifywait
команда, записанная на высокоэффективном языке C в специальных целях контролировать файл и создание каталога и модификацию. Можно установить его с командой:
sudo apt install inotify-tools
Psuedo-код для соответствующего сценария был бы:
Вы назвали бы сценарий от места как /etc/rc.local
таким образом, это работает, когда машина загружается.
Преимущество этой методологии - Вы, не проверяют каталог каждые 30 минут, а скорее Вы проверяете его спустя 30 минут после последних изменений в каталоге.
Существует изящная утилита для точно этой задачи: