Ограничьте размер папки, удалив самые старые файлы в OS X


0

Я запускаю OS X и у меня есть камера безопасности, которая записывает изображения в папку.

Есть ли способ ограничить размер этой папки, а затем удалить самый старый файл?


Да, вам может понадобиться сделать скрипт, чтобы сделать это, хотя. Вы когда-нибудь программировали или писали сценарии?
ботаник

Добро пожаловать в супер пользователя, для дальнейшего использования, вы должны прочитать справку. Хорошо перечислить то, что вы пробовали в своих вопросах.
spuder

Камера называет файлы по какому-либо шаблону? Полученные ответы будут удалять вещи в зависимости от времени их последнего изменения (поскольку * nixes, такие как OSX, не сохраняют время создания); единственный способ быть действительно уверенным в получении самых старых созданных - это если камера безопасности встраивает дату / время либо в имя файла, либо в некоторые метаданные.
evilsoup

Ответы:


3

Следующий сценарий оболочки неоднократно удаляет самый старый файл в данной папке, пока размер папки не станет меньше указанного максимального общего количества.

Предположения:

  • У вас установлен GNU, например, findutilsиз Homebrew
  • Не работает, когда файлы добавляются быстрее, чем можно определить размер папки

#!/bin/bash

# defensive
set -o nounset
set -o errexit
set -o pipefail

# directory to search
DIR=/Users/danielbeck/test

# max folder size in KB
MAXSIZE=1000

# as long as folder size is greater than limit
while [[ $( du -sk "$DIR" | cut -f1 ) -gt $MAXSIZE ]] ; do

    # find the oldest file (modification time counts)
    FILE="$( gfind "$DIR" -type f -printf '%T+ %p\n' | sort -n | head -n1 | cut -d' ' -f2- )"

    # delete it
    /bin/rm -v "$FILE"

 done

Вы можете изменить этот сценарий немного , чтобы он работать постоянно в фоновом режиме ( с использованием , например screen), или иметь его запустить каждую минуту (или каждые несколько минут) , используя , например cron.


0

Еще один скрипт оболочки:

cd ~/directory
for f in $(ls -t); do
  sum+=$(stat -f%z "$f")
  ((sum > 10*8)) && rm "$f"
done

10*8это 100 МБ. Если имена файлов содержат пробелы, добавьте IFS=$'\n'перед for. Если имена файлов можно интерпретировать как шаблоны glob, используйте set -fили замените цикл for на что-то подобное while IFS= read -r l; do :; done < <(ls -t). Используйте -c%sвместо -f%zс GNU stat.

Вы можете запускать скрипт каждые три часа, запустив EDITOR=nano crontab -eи добавив следующую строку:

0 */3 * * * bash ~/path/to/script.sh

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.