diff --git a/cleanup-tools/README.md b/cleanup-tools/README.md new file mode 100644 index 0000000..2c76ddf --- /dev/null +++ b/cleanup-tools/README.md @@ -0,0 +1,55 @@ +# Cleanup Tools + +Collection of bash scripts for cleaning and maintaining directories. + +## Scripts + +### remove-mac-files.sh + +Script to remove macOS hidden files recursively + +**Usage:** +```bash +./remove-mac-files.sh /path/to/directory +./remove-mac-files.sh . +``` +Or select folders in Nemo file manager and run as script + +**Parameters:** +- `directory` - Directory to clean (can specify multiple) + +**Examples:** +```bash +./remove-mac-files.sh /home/user/Downloads # Clean Downloads folder +./remove-mac-files.sh . # Clean current directory +./remove-mac-files.sh /media/usb /home/shared # Clean multiple directories +``` + +**Features:** +- Removes .DS_Store and ._* files recursively +- When used as Nemo script, progress is shown graphically +- No external dependencies required +- Dual-mode operation (GUI/Terminal) +- Progress tracking and final statistics + +**Dependencies:** +- `zenity` for GUI dialogs (usually pre-installed) +- Standard bash commands (find, rm) + +## Installation + +1. Make scripts executable: +```bash +chmod +x *.sh +``` + +2. For use as Nemo scripts, copy to: +```bash +~/.local/share/nemo/scripts/ +``` + +## Notes + +All scripts support dual-mode operation: +- **Terminal mode**: When run from command line +- **GUI mode**: When run as Nemo file manager scripts with zenity dialogs diff --git a/cleanup-tools/remove-mac-files.sh b/cleanup-tools/remove-mac-files.sh new file mode 100644 index 0000000..e0c1154 --- /dev/null +++ b/cleanup-tools/remove-mac-files.sh @@ -0,0 +1,187 @@ +#!/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 "$@" + +