103 lines
2.5 KiB
Bash
Executable File
103 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Function to display usage
|
|
usage() {
|
|
echo "Usage: $0 --dir <dir1> [<dir2> ...] [--min-free-space <space_in_GiB>] [--debug]" 1>&2
|
|
}
|
|
|
|
# Function to output error messages and exit
|
|
error_msg() {
|
|
echo "Error: $1" 1>&2
|
|
exit 1
|
|
}
|
|
|
|
# Function to output debug messages
|
|
debug_msg() {
|
|
if $DEBUG_MODE; then
|
|
echo "$1"
|
|
fi
|
|
}
|
|
|
|
# Initialize variables
|
|
declare -a DIRS
|
|
MIN_FREE_SPACE=200 # Default minimum free space in GiB
|
|
DEBUG_MODE=false
|
|
PARSE_DIRS=false
|
|
|
|
# Parse command-line arguments
|
|
for arg in "$@"; do
|
|
if $PARSE_DIRS; then
|
|
if [[ "$arg" =~ ^-- ]]; then
|
|
PARSE_DIRS=false
|
|
else
|
|
DIRS+=("$arg")
|
|
continue
|
|
fi
|
|
fi
|
|
|
|
case $arg in
|
|
--dir)
|
|
PARSE_DIRS=true
|
|
;;
|
|
--min-free-space)
|
|
MIN_FREE_SPACE="$2"
|
|
shift # Remove argument value
|
|
;;
|
|
--debug)
|
|
DEBUG_MODE=true
|
|
;;
|
|
*)
|
|
if [ "$arg" != "${DIRS[-1]}" ]; then
|
|
usage
|
|
error_msg "Unknown parameter passed: $arg"
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Check if at least one directory is provided and if it is indeed a directory
|
|
if [ ${#DIRS[@]} -eq 0 ]; then
|
|
usage
|
|
error_msg "No directories specified."
|
|
fi
|
|
|
|
for DIR in "${DIRS[@]}"; do
|
|
if [ ! -d "$DIR" ]; then
|
|
error_msg "'$DIR' is not a directory."
|
|
fi
|
|
done
|
|
|
|
# Check if all directories are on the same disk
|
|
PREV_DISK=""
|
|
for DIR in "${DIRS[@]}"; do
|
|
CURRENT_DISK=$(df "$DIR" | tail -n 1 | awk '{print $1}')
|
|
if [ -n "$PREV_DISK" ] && [ "$PREV_DISK" != "$CURRENT_DISK" ]; then
|
|
usage
|
|
error_msg "Directories are not on the same disk."
|
|
fi
|
|
PREV_DISK=$CURRENT_DISK
|
|
done
|
|
|
|
# Convert GiB to KiB (as df outputs in KiB)
|
|
MIN_FREE_SPACE_KiB=$((MIN_FREE_SPACE * 1024 * 1024))
|
|
|
|
# Get the free space on the disk where the directories are located
|
|
FREE_SPACE_KiB=$(df "${DIRS[0]}" | tail -n 1 | awk '{print $4}')
|
|
|
|
# Find files (not directories) in all specified directories, sort them by modification time (oldest first)
|
|
if [ $FREE_SPACE_KiB -lt $MIN_FREE_SPACE_KiB ]; then
|
|
debug_msg "Less than $MIN_FREE_SPACE GiB free, cleaning up..."
|
|
find "${DIRS[@]}" -type f -printf '%T+ %p\n' | sort | while IFS= read -r line; do
|
|
if [ $(df "${DIRS[0]}" | tail -n 1 | awk '{print $4}') -ge $MIN_FREE_SPACE_KiB ]; then
|
|
break
|
|
fi
|
|
FILE=$(echo "$line" | cut -d ' ' -f2-)
|
|
debug_msg "Deleting $FILE"
|
|
rm -f -- "$FILE"
|
|
REMAINING_SPACE_KiB=$(df "${DIRS[0]}" | tail -n 1 | awk '{print $4}')
|
|
debug_msg "Remaining space: $((REMAINING_SPACE_KiB / 1024 / 1024)) GiB"
|
|
done
|
|
else
|
|
debug_msg "Enough free space available."
|
|
fi
|