Vous possédez un dossier rempli de fichiers dont le début du nom commence par une chaîne de caractère et vous souhaiteriez les classer automatiquement ? Sans passer par un utilitaire dédié, il est possible d'utiliser le terminal de macOS et la commande rename, disponible dans les paquets Homebrew.

Cas de figure

Voici l'allure de vos fichiers à trier :

x_lorem_ipsum_dolor_sit_amet.jpg
x_lorem_ipsum_dolor_sit_amet.jpg

y_lorem_ipsum_dolor_sit_amet.jpg
y_lorem_ipsum_dolor_sit_amet.jpg

z_lorem_ipsum_dolor_sit_amet.jpg
z_lorem_ipsum_dolor_sit_amet.jpg
z_lorem_ipsum_dolor_sit_amet.jpg
z_lorem_ipsum_dolor_sit_amet.jpg

Et ce que vous souhaitez obtenir

x
y
z

Avec vos fichiers bien rangés à l'intérieur de chaque dossier

La solution avec rename

  1. Avant toute chose, sauvegardez votre dossier (sélectionner votre dossier puis appuyez sur command-D dans le Finder ou selectionner Fichier>Dupliquer dans le menu)
  2. Installer homebrew si ce n'est déjà fait (Homebrew prend un peu de temps à s'installler) puis téléchargez le package rename avec la commande suivante :
brew install rename

Simulation

Pour évaluer l'effet de rename sur vos fichier

1. Avec le terminal, déplacez-vous vers l'emplacement du dossier contenant les fichiers à trier :

cd /chemin/vers/le/dossier/

2. Saisissez la commande rename avec les arguments ci-dessous :

rename --dry-run -p 's|(^[^_]*)|$1/$1|' *.jpg
Nous allons expliquer très vite à quoi correspond cette étange syntaxe 😆

Le terminal affiche alors une simulation ; si le resultat vous convient vous pouvez lancer la commande suivante :

rename -p 's|(^[^_]*)|$1/$1|' *.jpg

Les fichiers sont triés !

Explications

Que signifie l'étrange commande que nous venons de lancer ? Décomposons-la.

--dry-run

Permet de tester la commande sans toucher aux fichier ; il s'agit de la simulation.

-p

L'argument qui indique à la commande qu'on souhaite créér un chemin intermédiaire (comme un sous-dossier).

*.jpg

Va permettre d'appliquer la commande à tous les fichiers se terminant par .jpg

's|...|' 

Ceci est le motif permettant à la commande d'effectuer une substitution. La forme de base est s|a|b, ou littéralement "substituer a avec b". Ici la forme est plus complexe car on cherche à détecter une chaine de caractère. Détaillons.

Partie a : ici le a est un caret (^), ce qui précise "le début du fichier" et [^_]* permet de chercher tout caractère qui n'est pas un underscore _. Dans les faits, pour reprendre notre exemple du haut, cette partie isole "x", "y" ou "z" dans le nom de nos fichiers en partant du début et s'arrête lorsqu'elle trouve l'underscore.

Partie b : $1 est la variable qui reprend la première chose trouvée entre parenthèses dans a. Donc b, ou $1/$1, revient à reprendre le début de fichier touvé avant l'underscore, y ajouter le slash / (qui permet de définir un sous-dossier) et ensuite de réinsérer ledit début de fichier.

Ou, pour reprendre l'exemple du haut, on substitue x_ par x/x pour chaque partie du nom de fichier placée avant l'underscore.

Ainsi, au final : x_lorem_ipsum_dolor_sit_amet.jpg devient x/x_lorem_ipsum_dolor_sit_amet.jpg

Personnaliser la commande

Détailler la commande ci-dessus n'est pas seulement une affaire de curiosité, mais aussi la possibilité de personnaliser la commande.

  • On peut remplacer l'underscore par d'autres caractères (comme le tiret)
  • Et bien entendu appliquer la commande à d'autres type de fichiers (préciser une autre extension)

Inspiré de cette page :

mac OS – Creating folders based on part of a filename
I’m running macOS and looking for a way to quickly sort thousands of jpg files. I need to create folders based on part of filenames and then move those files into it. Simply, I want to put these ...