Created
December 8, 2021 10:17
-
-
Save guionardo/de0491c3638873b9d8fb6abf0a6668ff to your computer and use it in GitHub Desktop.
Deleting files but keeping some in bash
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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