diff options
Diffstat (limited to 'rolling-directory')
-rw-r--r-- | rolling-directory | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/rolling-directory b/rolling-directory new file mode 100644 index 0000000..d85f8b7 --- /dev/null +++ b/rolling-directory | |||
@@ -0,0 +1,58 @@ | |||
1 | #!@zsh@/bin/zsh | ||
2 | |||
3 | set -e | ||
4 | |||
5 | PATH=@coreutils@/bin:@findutils@/bin:@gawk@/bin:@inotify@/bin:$PATH | ||
6 | |||
7 | dir=${1:A} | ||
8 | maxSize=$(numfmt --from=auto --to=none -- $2) | ||
9 | shift 2 | ||
10 | |||
11 | [[ -d "${dir}" ]] || exit 2 | ||
12 | [[ "${maxSize}" = <-> ]] || exit 2 | ||
13 | |||
14 | typeset -a findExtra | ||
15 | findExtra=(-not -path ${dir}/CACHEDIR.TAG) | ||
16 | |||
17 | resize() { | ||
18 | echo "Resizing ${dir} to below $(numfmt --to=iec-i --suffix=B -- ${maxSize})..." >&2 | ||
19 | |||
20 | while [[ $(du -xbs ${dir} | awk '{ print $1; }') -gt $maxSize ]]; do | ||
21 | find ${dir} -xdev -type f \( ${findExtra} \) -print0 | \ | ||
22 | xargs -r0 -- stat --printf '%W %Y %Z %X %n\0' | \ | ||
23 | sort -t '\0' -z | \ | ||
24 | awk -F '\0' '{ gsub("^\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+", "", $1); printf "%s\0", $1; }' | \ | ||
25 | xargs -r0 -- rm -v | ||
26 | done | ||
27 | |||
28 | find ${dir} -xdev -xtype l -print0 | xargs -r0 -- rm -v | ||
29 | find ${dir} -xdev -type d \( -not -path ${dir} \) -empty -print0 | xargs -r0 -- rmdir -v | ||
30 | } | ||
31 | |||
32 | case "${1}" in | ||
33 | monitor) | ||
34 | shift | ||
35 | |||
36 | typeset -a inotifyExtra | ||
37 | inotifyExtra=() | ||
38 | |||
39 | if [[ "${1}" = <-> ]]; then | ||
40 | inotifyExtra=(-t "${1}") | ||
41 | shift | ||
42 | fi | ||
43 | |||
44 | while | ||
45 | resize | ||
46 | inotifywait -qq -r ${dir} ${inotifyExtra} \ | ||
47 | -e modify \ | ||
48 | -e close_write \ | ||
49 | -e moved_to \ | ||
50 | -e move_self \ | ||
51 | -e create | ||
52 | true | ||
53 | do :; done | ||
54 | ;; | ||
55 | *) | ||
56 | resize | ||
57 | ;; | ||
58 | esac | ||