Files
Bash-Utility-Scripts/cleanup-tools/remove-mac-files.sh

188 lines
6.5 KiB
Bash

#!/bin/bash
# Script to remove macOS hidden files (.DS_Store, ._*) recursively
# Usage: ./remove-mac-files.sh /path/to/directory
# Usage: ./remove-mac-files.sh .
# Works as Nemo script with selected folders
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Main function
main() {
local directories=("$@")
# Get directories to process
local target_dirs=()
# If we have directory arguments, process them
if [ ${#directories[@]} -gt 0 ]; then
# Process directory arguments and check if they exist
for dir in "${directories[@]}"; do
if [ -d "$dir" ]; then
target_dirs+=("$dir")
else
echo -e "${RED}Error: Directory '$dir' does not exist.${NC}" >&2
fi
done
else
echo -e "${RED}Error: No directory specified.${NC}"
echo -e "${YELLOW}Usage from terminal: $0 /path/to/directory${NC}"
echo -e "${YELLOW}Usage from terminal: $0 .${NC}"
echo -e "${YELLOW}Or select folders in Nemo and run as script${NC}"
exit 1
fi
if [ ${#target_dirs[@]} -eq 0 ]; then
echo -e "${YELLOW}No valid directories found to process.${NC}"
exit 0
fi
local total_dirs=${#target_dirs[@]}
# Detect if running from Nemo (file manager) or terminal
local use_gui=false
# Use GUI if we're likely running from Nemo and zenity is available
if [ -n "$NEMO_SCRIPT_SELECTED_FILE_PATHS" ] && command -v zenity &> /dev/null; then
use_gui=true
fi
# Show initial info only for terminal
if [ "$use_gui" = false ]; then
echo -e "${GREEN}macOS hidden files cleanup started${NC}"
echo -e "${BLUE}Directories to process: ${total_dirs}${NC}"
echo ""
fi
# Process each directory with appropriate progress display
local count=0
local total_removed=0
if [ "$use_gui" = true ]; then
# Create temporary files for counting
local count_file=$(mktemp)
local dirs_file=$(mktemp)
echo "0" > "$count_file"
echo "0" > "$dirs_file"
# Use zenity progress bar for GUI
(
local local_count=0
for dir in "${target_dirs[@]}"; do
local_count=$((local_count + 1))
dir_name=$(basename "$dir")
echo "# Cleaning $dir_name... ($local_count/$total_dirs)"
# Count and remove macOS hidden files
local removed_count=0
# Find and count .DS_Store files
while IFS= read -r -d '' file; do
rm -f "$file" && removed_count=$((removed_count + 1))
done < <(find "$dir" -type f -name ".DS_Store" -print0 2>/dev/null)
# Find and count ._* files
while IFS= read -r -d '' file; do
rm -f "$file" && removed_count=$((removed_count + 1))
done < <(find "$dir" -type f -name "._*" -print0 2>/dev/null)
# Update counts in temporary files
local current_total=$(cat "$count_file")
echo "$((current_total + removed_count))" > "$count_file"
echo "$local_count" > "$dirs_file"
echo "$((local_count * 100 / total_dirs))"
done
) | zenity --progress --title="macOS Files Cleanup" --text="Initializing..." --percentage=0 --auto-close
# Read final counts from temporary files
total_removed=$(cat "$count_file")
count=$(cat "$dirs_file")
rm -f "$count_file" "$dirs_file"
# Check if user cancelled
if [ $? -ne 0 ]; then
zenity --error --text="Cleanup was cancelled."
exit 1
fi
else
# Use terminal progress bar
for dir in "${target_dirs[@]}"; do
count=$((count + 1))
dir_name=$(basename "$dir")
# Show terminal progress
local percentage=$((count * 100 / total_dirs))
printf "\r${BLUE}[%3d%%] Cleaning $dir_name ($count/$total_dirs)${NC}" "$percentage"
# Count and remove macOS hidden files
local removed_count=0
# Find and count .DS_Store files
while IFS= read -r -d '' file; do
rm -f "$file" && removed_count=$((removed_count + 1))
done < <(find "$dir" -type f -name ".DS_Store" -print0 2>/dev/null)
# Find and count ._* files
while IFS= read -r -d '' file; do
rm -f "$file" && removed_count=$((removed_count + 1))
done < <(find "$dir" -type f -name "._*" -print0 2>/dev/null)
total_removed=$((total_removed + removed_count))
done
echo "" # New line after progress
fi
# Show final report
if [ "$use_gui" = true ]; then
# Show report with zenity
local report_message="✓ Cleanup completed!\n\n"
report_message+="Directories processed: ${count}\n"
report_message+="Files removed: ${total_removed}"
zenity --info --title="macOS Files Cleanup Complete" --text="$report_message"
else
# Show report in terminal
echo ""
echo -e "${GREEN}✓ Cleanup completed!${NC}"
echo ""
echo -e "${BLUE}Results:${NC}"
echo -e " Directories processed: ${count}"
echo -e " Files removed: ${total_removed}"
fi
}
# Show help if requested
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
echo -e "${GREEN}Script to remove macOS hidden files recursively${NC}"
echo ""
echo -e "${YELLOW}Usage:${NC}"
echo " $0 /path/to/directory"
echo " $0 ."
echo " Or select folders in Nemo file manager and run as script"
echo ""
echo -e "${YELLOW}Parameters:${NC}"
echo " directory Directory to clean (can specify multiple)"
echo ""
echo -e "${YELLOW}Examples:${NC}"
echo " $0 /home/user/Downloads # Clean Downloads folder"
echo " $0 . # Clean current directory"
echo " $0 /media/usb /home/shared # Clean multiple directories"
echo ""
echo -e "${BLUE}Note: Removes .DS_Store and ._* files recursively${NC}"
echo -e "${BLUE} When used as Nemo script, progress is shown graphically${NC}"
echo -e "${BLUE} No external dependencies required${NC}"
exit 0
fi
# Execute main
main "$@"