Pour trier les fichiers directement dans Téléchargements dans des dossiers par extension, utilisez un script qui examine les fichiers immédiats, crée des dossiers comme txt et csv, et ignore les noms de destination déjà existants. Commencez par l’exemple jetable ci-dessous, prévisualisez les déplacements, puis exécutez-le depuis Terminal ou Raccourcis Apple.

Ce guide s’adresse aux utilisateurs de Mac qui souhaitent déplacer physiquement des fichiers isolés dans des dossiers tout en laissant intacts les sous-dossiers existants et leur contenu. Son principal outil d’aide à la décision est un rapport d’aperçu : chaque fichier admissible reçoit une destination proposée, tandis que les conflits et les noms non pris en charge font l’objet d’un message d’ignoré explicite.

Que sera déplacé et qu’est-ce qui restera en place ?

Le Finder propose des options de tri et de regroupement, ainsi que des dossiers et des dossiers intelligents. Apple explique qu’un dossier intelligent regroupe les fichiers correspondants sans les déplacer. Pour cette tâche, le résultat souhaité est constitué de véritables dossiers par extension contenant les fichiers déplacés. Organiser les fichiers dans le Finder sur Mac.

Avant d’examiner l’exemple, ouvrez le Finder et choisissez Finder > Réglages > Options avancées, puis sélectionnez Afficher toutes les extensions de fichier. Les suffixes utilisés par le trieur seront ainsi visibles. Afficher une extension ne modifie pas le format du fichier. Afficher ou masquer les extensions de fichier sur Mac.

Le script ci-dessous suit des règles délibérées. Elles décrivent cette implémentation, et non un comportement universel du Finder ou de Raccourcis :

Élément rencontré Comportement du trieur
Un fichier ordinaire immédiat tel que note.TXT Propose txt/note.TXT ; conserve le nom de fichier d’origine
Un nom composé tel que bundle.tar.gz Utilise le suffixe final : gz/bundle.tar.gz
Un fichier sans point ou se terminant par un point Le laisse en place et signale qu’il est ignoré
Un dossier, y compris un dossier dont le nom contient une extension Le laisse en place, ainsi que son contenu
Un nom commençant par un point L’exclut de l’analyse
Un lien symbolique Le laisse en place
Une extension contenant autre chose que des lettres et chiffres ASCII, ou de plus de 32 caractères Laisse le fichier en place et signale qu’il est ignoré
Une destination portant le même nom de fichier Laisse le fichier source en place et signale un conflit
Un nom de dossier de destination occupé par un fichier ordinaire ou un lien symbolique Signale un dossier bloqué et laisse le fichier source en place

Ces restrictions sur les extensions rendent la règle de nommage des dossiers simple et prévisible. Un fichier ignoré reste disponible pour une décision manuelle ; le script n’invente pas de nom de remplacement et ne le supprime pas silencieusement.

Créer un exemple jetable dans Téléchargements

Ouvrez Terminal et collez le bloc de préparation complet suivant. Il crée uniquement des fichiers texte synthétiques dans Downloads/ExtensionSortDemo. Certains portent des extensions illustratives comme .gz ; leur contenu est du texte d’exemple brut, et non un exemple de ces formats. La préparation s’arrête si ce dossier de démonstration existe déjà ; la relancer ne réinitialisera donc pas un test précédent.

Apple documente Terminal comme un moyen d’exécuter des commandes et des scripts shell, et documente mv pour déplacer des fichiers locaux. Ici, Terminal permet de prévisualiser clairement chaque déplacement prévu avant de l’effectuer. Qu’est-ce que Terminal sur Mac ?, Gérer des fichiers dans Terminal sur Mac.

/bin/bash <<'BASH'
set -eu
demo="$HOME/Downloads/ExtensionSortDemo"
/bin/mkdir "$demo"
/bin/mkdir "$demo/nested" "$demo/txt"
printf 'sample text\n' > "$demo/sample.txt"
printf 'uppercase suffix example\n' > "$demo/note.TXT"
printf 'name,value\nblue,1\n' > "$demo/palette.csv"
printf 'synthetic compound-name example\n' > "$demo/bundle.tar.gz"
printf 'no extension example\n' > "$demo/README"
printf 'trailing dot example\n' > "$demo/trailing."
printf 'hidden example\n' > "$demo/.hidden.txt"
printf 'nested example\n' > "$demo/nested/inside.txt"
printf 'existing destination example\n' > "$demo/txt/sample.txt"
printf 'blocks creation of a csv folder\n' > "$demo/csv"
printf 'Created demo folder: %s\n' "$demo"
BASH

Ouvrez Téléchargements dans le Finder, puis ouvrez ExtensionSortDemo. Remarquez les deux fichiers différents nommés sample.txt : l’un à la racine du dossier de démonstration et l’autre déjà dans txt. Remarquez aussi que csv est un fichier. Il s’agit de tests intentionnels de deux raisons courantes pour lesquelles un déplacement doit être ignoré.

Prévisualiser le trieur avant de déplacer les fichiers

Collez le programme complet ci-dessous dans Terminal. Son réglage initial est mode=preview : il affiche les déplacements proposés sans créer de dossiers par extension ni déplacer de fichiers. Le chemin racine configuré pointe vers le dossier de démonstration jetable, et non vers l’ensemble du dossier Téléchargements.

/bin/bash <<'BASH'
set -u
export LC_ALL=C
unset GLOBIGNORE
shopt -s nullglob
shopt -u dotglob

root="$HOME/Downloads/ExtensionSortDemo"
mode=preview

case "$mode" in
  preview|move) ;;
  *) printf 'Invalid mode\n' >&2; exit 1 ;;
esac
if [ ! -d "$root" ] || [ -L "$root" ]; then
  printf 'Root must be an existing ordinary folder\n' >&2
  exit 1
fi
for file in "$root"/*; do
  if [ -L "$file" ] || [ ! -f "$file" ]; then
    printf 'SKIP non-regular: %q\n' "$file"
    continue
  fi
  name=${file##*/}
  case "$name" in
    *.*) ext=${name##*.} ;;
    *) printf 'SKIP no extension: %q\n' "$name"; continue ;;
  esac
  case "$ext" in
    ''|*[!A-Za-z0-9]*)
      printf 'SKIP unsupported extension: %q\n' "$name"
      continue ;;
  esac
  if [ "${#ext}" -gt 32 ]; then
    printf 'SKIP long extension: %q\n' "$name"
    continue
  fi
  ext=$(printf '%s' "$ext" | /usr/bin/tr '[:upper:]' '[:lower:]')
  folder="$root/$ext"
  dest="$folder/$name"
  if [ -L "$folder" ] || { [ -e "$folder" ] && [ ! -d "$folder" ]; }; then
    printf 'SKIP blocked folder: %q\n' "$folder"
    continue
  fi
  if [ -e "$dest" ] || [ -L "$dest" ]; then
    printf 'SKIP collision: %q\n' "$dest"
    continue
  fi
  if [ "$mode" = preview ]; then
    printf 'WOULD MOVE %q -> %q\n' "$file" "$dest"
    continue
  fi
  /bin/mkdir -p "$folder" || exit 1
  /bin/mv -n "$file" "$dest" || exit 1
  if [ -e "$file" ] || [ -L "$file" ]; then
    printf 'NOT MOVED: %q\n' "$file" >&2
    exit 1
  fi
  printf 'MOVED %q -> %q\n' "$file" "$dest"
done
printf 'Finished (%s). Review all SKIP lines.\n' "$mode"
BASH

Le motif des enfants immédiats "$root"/* ne parcourt pas les répertoires. Les vérifications des fichiers excluent ensuite les répertoires et les liens symboliques. nullglob gère un dossier vide sans traiter un motif sans correspondance comme un nom de fichier ; la désactivation de dotglob exclut les noms commençant par un point. Ces comportements sont documentés dans le manuel de Bash distribué par Apple. Manuel de Bash.

Le script extrait le suffixe final et convertit ses lettres en minuscules avec tr. Par conséquent, note.TXT conserve son nom de fichier, mais va dans txt. Le manuel tr d’Apple documente la correspondance des caractères majuscules vers les minuscules utilisée ici. tr(1) — traduire des caractères.

Pour ce jeu de données, les résultats attendus importants sont les suivants :

Source synthétique Résultat attendu de l’aperçu
note.TXT Déplacement prévu vers txt/note.TXT
bundle.tar.gz Déplacement prévu vers gz/bundle.tar.gz
sample.txt Conflit avec txt/sample.txt ; ignoré
palette.csv Le nom de dossier csv est bloqué par un fichier ; ignoré
README Pas d’extension ; ignoré
trailing. Extension vide ; ignoré
nested/inside.txt Jamais examiné
.hidden.txt Jamais examiné

Il s’agit des résultats attendus sur le système de fichiers, et non d’une affirmation selon laquelle les déplacements ont été effectués pendant la préparation. Le programme a passé une vérification de syntaxe Bash, et un contrôle distinct et déterministe du mappage des noms de fichier a confirmé l’extraction du suffixe et sa conversion en minuscules. Cet environnement de préparation était en lecture seule ; le processus complet de déplacement sur macOS n’a donc pas été exécuté.

Déplacer les fichiers d’exemple et vérifier le résultat

Une fois l’aperçu conforme au tableau, collez de nouveau le même programme complet en ne modifiant que mode=preview en mode=move. Pour ce test, conservez la racine de démonstration.

En mode déplacement, mkdir -p crée le dossier requis ou accepte un répertoire existant. Il ne transforme pas un fichier ordinaire existant en dossier, d’où la vérification préalable du dossier de destination par le script. mkdir(1) — créer des répertoires.

Le déplacement utilise mv -n de macOS, qui, selon sa documentation, évite d’écraser un fichier existant. La vérification préalable de l’existence fournit un message de conflit lisible ; la vérification ultérieure de la source détecte un déplacement qui aurait laissé le fichier source en place. Le programme s’arrête en cas d’échec de commande signalé. mv(1) — déplacer des fichiers.

Vérifiez le dossier de démonstration dans le Finder. Vous devriez trouver note.TXT dans txt, et bundle.tar.gz dans un dossier gz nouvellement créé. Les deux versions de sample.txt devraient toujours exister à leurs emplacements d’origine. palette.csv devrait rester à la racine, et nested/inside.txt devrait rester dans nested.

La ligne finale Finished signifie que l’analyse est terminée ; examinez également les messages signalant les éléments ignorés. Si vous relancez le trieur, les fichiers déjà triés devraient rester dans leurs dossiers, car ces dossiers ne sont pas parcourus de manière récursive.

Exécuter le même trieur depuis Raccourcis Apple

Raccourcis peut servir de bouton pour ce script. Apple documente la prise en charge intégrée de l’écriture et de l’exécution de scripts shell dans l’éditeur de Raccourcis. Le programme shell effectue le mappage des extensions et les vérifications d’existence ; cet article ne suppose pas qu’une action native de déplacement de fichiers gère les conflits de la même façon. Découvrir Raccourcis pour macOS.

Créez le raccourci manuellement et gardez-le configuré pour le dossier de démonstration pendant les tests :

  1. Ouvrez Raccourcis, cliquez sur le bouton d’ajout et nommez le raccourci Sort Extension Demo.
  2. Recherchez l’action Run Shell Script dans la liste et ajoutez-la.
  3. Définissez le shell sur /bin/bash. Collez le bloc complet du trieur ci-dessus dans le champ de script, y compris sa ligne d’ouverture /bin/bash et le délimiteur final BASH. Conservez d’abord mode=preview.
  4. Ajoutez Quick Look après l’action de script et reliez-la à la sortie du script.
  5. Exécutez le raccourci et examinez le rapport d’aperçu avant de modifier le script pour mode=move.

Apple documente la création d’un raccourci en ajoutant des actions et en le testant, et recommande Quick Look pour examiner le contenu transmis entre les actions. Créer un raccourci personnalisé sur Mac, Tester vos actions dans Raccourcis sur Mac.

Ce raccourci ne nécessite aucun fichier en entrée : le chemin racine est défini dans le script. Sa sortie en cas de réussite est un rapport textuel affiché par Quick Look. Ce rapport n’est pas un ensemble d’objets fichier déplacés à transmettre à une autre action de fichier. Pour examiner les entrées acceptées par une action et sa sortie sur la version installée, cliquez sur son icône en maintenant la touche Contrôle enfoncée, puis choisissez Afficher les informations, comme l’indique Apple. Naviguer dans la liste d’actions de Raccourcis sur Mac.

Si Raccourcis exige l’activation de l’exécution des scripts, le réglage documenté par Apple est Raccourcis > Réglages > Options avancées > Autoriser l’exécution des scripts. Si l’action shell n’est pas disponible dans votre installation, utilisez le programme Terminal complet ci-dessus ; il effectue la même tâche de tri de façon autonome. Réglages avancés de confidentialité et de sécurité dans Raccourcis sur Mac.

Appliquer la règle à la racine de Téléchargements

Après le test jetable, la modification de configuration à apporter au dossier Téléchargements réel consiste à remplacer une seule ligne dans le trieur par la suivante. Il s’agit d’un fragment de configuration, et non d’un programme de tri autonome :

root="$HOME/Downloads"

Revenez à mode=preview chaque fois que vous modifiez la racine. Examinez chaque destination proposée et chaque message d’élément ignoré avant d’activer les déplacements. Le programme traite ensemble les fichiers immédiats admissibles ; il ne propose pas d’invite de sélection individuelle.

Utilisez-le comme traitement par lots lancé manuellement sur un dossier dont le transfert des fichiers est terminé. Le script ne détermine pas si un téléchargement est terminé, ne surveille pas les ajouts ultérieurs et ne coordonne pas les exécutions simultanées. Ses vérifications et le déplacement sont des opérations distinctes ; évitez donc toute autre activité de déplacement de fichiers dans le dossier pendant son exécution. Un aperçu est un rapport de l’état actuel, pas une réservation de ces destinations.

En cas de conflit, examinez les deux fichiers dans le Finder et décidez de renommer le fichier à la racine ou de le laisser là où il est. Si un dossier par extension est bloqué, déplacez l’élément occupant ce nom de dossier avant de relancer le script. Aucune de ces situations ne nécessite de modifier le programme pour qu’il écrase des fichiers.

Pour terminer, vérifiez dans le Finder les dossiers de destination réels et comparez les éventuels fichiers encore présents à la racine avec le rapport. L’exemple jetable constitue un test d’acceptation concret : les fichiers visés sont déplacés, les noms existants restent intacts et le contenu imbriqué reste à son emplacement initial.

Sources