109 lines
3.7 KiB
Bash
109 lines
3.7 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
# Define variables
|
||
|
DUPLICATE_LIST="duplicates.txt" # Hard-coded duplicate list file
|
||
|
LOG_FILE="deleted_duplicates.log" # Main log file
|
||
|
TIME_LOG_FILE="deletion_times.log" # Secondary log file to track deletion time
|
||
|
OUTPUT_LOG_FILE="output.log" # Third log file for terminal output
|
||
|
SAVED_SPACE_LOG_FILE="saved_space.log" # Log file for saved space
|
||
|
ERROR_LOG_FILE="error.log" # Log file for errors
|
||
|
DRY_RUN=false # Set to true to simulate actions
|
||
|
CONFIRM=false # Set to true to enable confirmation before deletion
|
||
|
|
||
|
# Function to display usage
|
||
|
usage() {
|
||
|
echo "Usage: $0 [--dry-run] [--confirm]"
|
||
|
echo " --dry-run Simulate the file removal process."
|
||
|
echo " --confirm Ask for confirmation before each delete."
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
# Parse optional flags
|
||
|
for arg in "$@"; do
|
||
|
case $arg in
|
||
|
--dry-run)
|
||
|
DRY_RUN=true
|
||
|
shift
|
||
|
;;
|
||
|
--confirm)
|
||
|
CONFIRM=true
|
||
|
shift
|
||
|
;;
|
||
|
*)
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
# Create or clear the log files
|
||
|
: > "$LOG_FILE"
|
||
|
: > "$TIME_LOG_FILE"
|
||
|
: > "$OUTPUT_LOG_FILE"
|
||
|
: > "$SAVED_SPACE_LOG_FILE"
|
||
|
: > "$ERROR_LOG_FILE" # Clear the error log file
|
||
|
|
||
|
# Initialize counters and total saved space
|
||
|
total_files_processed=0
|
||
|
total_files_deleted=0
|
||
|
total_files_skipped=0
|
||
|
total_saved_bytes=0
|
||
|
|
||
|
# Iterate over each duplicate file path in the list
|
||
|
while IFS= read -r file_path; do
|
||
|
total_files_processed=$((total_files_processed + 1))
|
||
|
|
||
|
if [ -f "$file_path" ]; then
|
||
|
# Show a confirmation prompt (if enabled)
|
||
|
if [ "$CONFIRM" = true ]; then
|
||
|
read -p "Delete $file_path? (y/n) " response
|
||
|
if [[ "$response" != "y" ]]; then
|
||
|
echo "Skipped: $file_path" | tee -a "$LOG_FILE" "$OUTPUT_LOG_FILE"
|
||
|
total_files_skipped=$((total_files_skipped + 1))
|
||
|
continue
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
# Get the size of the file before deletion
|
||
|
file_size=$(stat -c%s "$file_path")
|
||
|
total_saved_bytes=$((total_saved_bytes + file_size))
|
||
|
|
||
|
# Time the deletion or moving process
|
||
|
start_time=$(date +%s%3N)
|
||
|
|
||
|
# Check if we're in dry run mode
|
||
|
if [ "$DRY_RUN" = true ]; then
|
||
|
echo "[Dry Run] Would delete: $file_path (Size: $file_size bytes)" | tee -a "$LOG_FILE" "$OUTPUT_LOG_FILE"
|
||
|
else
|
||
|
# Attempt to move the file
|
||
|
if mv "$file_path" "$BACKUP_DIR/"; then
|
||
|
echo "Moved: $file_path" | tee -a "$LOG_FILE" "$OUTPUT_LOG_FILE"
|
||
|
total_files_deleted=$((total_files_deleted + 1))
|
||
|
else
|
||
|
echo "Error moving file: $file_path" | tee -a "$ERROR_LOG_FILE"
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
end_time=$(date +%s%3N)
|
||
|
duration=$((end_time - start_time))
|
||
|
|
||
|
# Log the time taken to the secondary log file
|
||
|
echo "File: $file_path | Time: ${duration}ms" >> "$TIME_LOG_FILE"
|
||
|
else
|
||
|
echo "File not found: $file_path" | tee -a "$LOG_FILE" "$OUTPUT_LOG_FILE"
|
||
|
total_files_skipped=$((total_files_skipped + 1))
|
||
|
fi
|
||
|
done < "$DUPLICATE_LIST"
|
||
|
|
||
|
# Convert total saved bytes to human-readable format
|
||
|
human_readable_size=$(numfmt --to=iec-i --suffix=B $total_saved_bytes)
|
||
|
|
||
|
# Log the total saved space in both formats
|
||
|
echo "Total space saved: $total_saved_bytes bytes ($human_readable_size)" | tee -a "$SAVED_SPACE_LOG_FILE" "$OUTPUT_LOG_FILE"
|
||
|
|
||
|
# Summary Report
|
||
|
echo "----- Summary Report -----" | tee -a "$OUTPUT_LOG_FILE"
|
||
|
echo "Total files processed: $total_files_processed" | tee -a "$OUTPUT_LOG_FILE"
|
||
|
echo "Total files deleted: $total_files_deleted" | tee -a "$OUTPUT_LOG_FILE"
|
||
|
echo "Total files skipped: $total_files_skipped" | tee -a "$OUTPUT_LOG_FILE"
|
||
|
|
||
|
echo "Duplicate removal process completed. See $LOG_FILE, $TIME_LOG_FILE, $OUTPUT_LOG_FILE, $SAVED_SPACE_LOG_FILE, and $ERROR_LOG_FILE for details."
|