Skip to content

Instantly share code, notes, and snippets.

@guionardo
Created December 8, 2021 10:17
Show Gist options
  • Save guionardo/de0491c3638873b9d8fb6abf0a6668ff to your computer and use it in GitHub Desktop.
Save guionardo/de0491c3638873b9d8fb6abf0a6668ff to your computer and use it in GitHub Desktop.
Deleting files but keeping some in bash
#!/usr/bin/env bash
# With this tool you can delete files using a mask, but keeping some files
# I've wrote this tool to house keep log files
# Usage: bash delete_old.sh <number of files to keep> "folder/mask"
# If you use mask like * or ? in your command, add quotes to prevent enumeration
keep=$(($1))
folder=${2:-...}
if [ $keep -le 0 ] || [ "$folder" = "..." ]; then
echo "Usage:"
echo " $(basename $0) <files_to_keep_as_integer> \"<folder/mask>\""
exit 1
fi
files=($folder)
len=${#files[@]}
if [ $len -eq 0 ] || [ ! -f "${files[0]}" ]; then
echo "No files found @ $folder"
exit 2
else
if [ $len -le $keep ]; then
echo "Found $len files @ $folder - No need to delete"
exit 1
fi
echo "Found $len files @ $folder - keeping $keep files"
fi
slice=${files[@]:0:$(($len - $keep))}
for file in $slice; do
if [[ -d $file ]]; then
if rm -r $file; then
echo "Removed dir: $file"
else
echo "Failed to remove dir: $file"
fi
else
if [[ -f $file ]]; then
if rm $file; then
echo "Removed file: $file"
else
echo "Failed to remove file: $file"
fi
fi
fi
done
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment