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
- 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) - 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 :
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 :