Created
May 9, 2025 15:43
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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