Skip to content

Instantly share code, notes, and snippets.

@dzogrim
Created May 9, 2025 15:43
Show Gist options
  • Save dzogrim/9be4a9ed3d23bebb7b4c2a550eb1da5d to your computer and use it in GitHub Desktop.
Save dzogrim/9be4a9ed3d23bebb7b4c2a550eb1da5d to your computer and use it in GitHub Desktop.
Truncate overly long filenames (>140 characters) in a given directory to prevent issues on SMB shares. This addresses a specific problem where very long filenames cause repeated backup behavior in Syncovery 10.17.5 when using SMB.
#!/usr/bin/env bash
set -euo pipefail
# ──────────────────────────────────────────────────────────────────────────────
# But : Tronquer les noms de fichiers trop longs (>140 caractères) dans un
# répertoire donné pour éviter des 'problèmes' sur des partages SMB.
# Ceci règle un problème particulier sur des noms très longs et SMB
# via l'application de sauvegarde Syncovery 10.17.5.
# Mode : Dry-run par défaut. Utiliser --APPLY pour appliquer les renommages.
# ──────────────────────────────────────────────────────────────────────────────
usage() {
echo "Usage: $0 [RÉPERTOIRE] [--APPLY]"
echo ""
echo " RÉPERTOIRE Répertoire à analyser (par défaut: dossier courant)"
echo " --APPLY Applique réellement les renommages"
echo ""
echo "Ce script détecte les fichiers dont le NOM (pas le chemin) dépasse 140 caractères"
echo "et les renomme en les tronquant proprement. Il affiche les changements proposés."
exit 1
}
# ───── Paramètres ─────
ROOT="${1:-.}"
MODE="${2:-}"
MAX_FILENAME_LEN=140
# ───── Validation simple ─────
[[ "$ROOT" == "-h" || "$ROOT" == "--help" ]] && usage
[[ ! -d "$ROOT" ]] && echo "❌ Erreur : \"$ROOT\" n’est pas un répertoire valide." && usage
# ───── Affichage mode ─────
if [[ "$MODE" == "--APPLY" ]]; then
echo "⚠️ Mode live activé : les fichiers seront renommés dans \"$ROOT\"."
else
echo "🧪 Mode dry-run dans \"$ROOT\" (aucune modification)."
echo " Pour appliquer les renommages : $0 \"$ROOT\" --APPLY"
fi
# ───── Boucle principale ─────
find "$ROOT" -maxdepth 1 -type f | while read -r filepath; do
dir=$(dirname "$filepath")
filename=$(basename "$filepath")
filename_len=${#filename}
if (( filename_len > MAX_FILENAME_LEN )); then
ext="${filename##*.}"
base="${filename%.*}"
# Cas sans extension
if [[ "$filename" == "$ext" ]]; then
ext=""
base="$filename"
fi
shortbase=$(echo "$base" | cut -c1-140)
newname="$shortbase"
[[ -n "$ext" ]] && newname+=".${ext}"
newpath="${dir}/${newname}"
if [[ -e "$newpath" ]]; then
echo "⚠️ [EXISTE] $newpath → nom déjà pris, ignoré."
else
if [[ "$MODE" == "--APPLY" ]]; then
echo "✂️ [RENOMMÉ]"
echo " $filepath"
echo " → $newpath"
mv "$filepath" "$newpath"
else
echo "🔧 [DRY-RUN]"
echo " $filepath"
echo " → $newpath"
fi
fi
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment