#!/bin/bash set -euo pipefail ########################## # Color helpers (printf-safe, no tput) ########################## RED="\033[0;31m" GREEN="\033[0;32m" YELLOW="\033[0;33m" CYAN="\033[0;36m" GRAY="\033[0;37m" BOLD="\033[1m" RESET="\033[0m" # Disable colors if output is not a terminal if [ ! -t 1 ]; then RED="" GREEN="" YELLOW="" CYAN="" GRAY="" BOLD="" RESET="" fi say_red() { printf "\n"; printf "%b%s%b\n" "$RED" "$*" "$RESET"; } say_green() { printf "\n"; printf "%b%s%b\n" "$GREEN" "$*" "$RESET"; } say_yellow() { printf "\n"; printf "%b%s%b\n" "$YELLOW" "$*" "$RESET"; } say_cyan() { printf "\n"; printf "%b%s%b\n" "$CYAN" "$*" "$RESET"; } say_gray() { printf "\n"; printf "%b%s%b\n" "$GRAY" "$*" "$RESET"; } say_bold() { printf "\n"; printf "%b%s%b\n" "$BOLD" "$*" "$RESET"; } ########################## # OS Detection ########################## say_yellow "################### Start OS Detection" source /etc/os-release OS_ID="${ID,,}" OS_LIKE="${ID_LIKE:-}" OS_LIKE="${OS_LIKE,,}" OS_VERSION="${VERSION_ID:-unknown}" OS_PRETTY="$PRETTY_NAME" OS="" case "$OS_ID" in arch) OS="arch" ;; debian) OS="debian" ;; ubuntu) OS="ubuntu" ;; fedora) OS="fedora" ;; *) if [[ "$OS_LIKE" == *"ubuntu"* ]]; then OS="ubuntu" elif [[ "$OS_LIKE" == *"arch"* ]]; then OS="arch" elif [[ "$OS_LIKE" == *"debian"* ]]; then OS="debian" elif [[ "$OS_LIKE" == *"fedora"* || "$OS_LIKE" == *"rhel"* ]]; then OS="fedora" fi ;; esac if [[ -n "$OS" ]]; then say_cyan "Detected OS: $OS ($OS_PRETTY)" say_cyan "Version: $OS_VERSION" else say_red "ERROR: Unsupported or unknown Linux distribution." say_red "Detected: ID=$OS_ID, ID_LIKE=${OS_LIKE:-empty}" exit 1 fi say_yellow "End Detection" ########################## # Copy Dotfiles Logic ########################## say_yellow "################### Start Copy Dotfiles" # The directory where the script is located (containing arch, debian, etc. folders) SCRIPT_DIR="$(dirname "$(realpath "$0")")" # The source directory for the detected OS DOTFILES_SRC_DIR="$SCRIPT_DIR/$OS" # The target directory TARGET_DIR="/etc/skel" # 1. Check if the source directory for the detected OS exists if [[ ! -d "$DOTFILES_SRC_DIR" ]]; then say_red "ERROR: Distribution-specific dotfiles directory not found: $DOTFILES_SRC_DIR" exit 1 fi say_cyan "Source Directory: $DOTFILES_SRC_DIR" say_cyan "Target Directory: $TARGET_DIR" # 2. Check for root/sudo privileges (required for writing to /etc/skel) if [ "$(id -u)" -ne 0 ]; then say_red "ERROR: This script must be run with root/sudo privileges to write to $TARGET_DIR." exit 1 fi # 3. Perform the copy operation # The 'cp -r' command copies the *contents* of the source directory (DOTFILES_SRC_DIR) # to the target directory (TARGET_DIR), overwriting existing files silently. # The 'cp -rT' flag is often safer to ensure the contents are copied, not the directory itself. # On systems that don't support 'T', using a trailing '/' on the source is safer: cp -r "$DOTFILES_SRC_DIR/" "$TARGET_DIR" say_bold "Copying contents of $OS dotfiles to $TARGET_DIR..." # Use rsync for a more robust and flexible copy/sync operation # -a: archive mode (preserves permissions, ownership, timestamps) # -v: verbose # -r: recursive (rsync is usually recursive by default, but included for clarity) # --delete: optional, removes files in TARGET_DIR that are not in DOTFILES_SRC_DIR (be careful with this!) if command -v rsync >/dev/null 2>&1; then # Ensure a trailing slash on the source to copy contents *of* the directory rsync -avz "$DOTFILES_SRC_DIR/" "$TARGET_DIR" say_green "Successfully synchronized dotfiles using rsync." else # Fallback to cp if rsync is not available say_yellow "rsync not found. Falling back to 'cp -r'." cp -r "$DOTFILES_SRC_DIR/." "$TARGET_DIR" say_green "Successfully copied dotfiles using cp." fi say_green "Dotfiles for $OS copied to $TARGET_DIR." say_yellow "End Copy Dotfiles" say_yellow "########################################################################" say_yellow "FINAL SKEL" say_yellow "Copying all files and folders from /etc/skel to ~" say_yellow "First we make a backup of .config" say_yellow "Wait for it ...." say_yellow "########################################################################" cp -Rf ~/.config ~/.config-backup-$(date +%Y.%m.%d-%H.%M.%S) cp -arf /etc/skel/. ~ say_yellow "##############################################################" say_yellow "################### $(basename $0) done" say_yellow "##############################################################"