J'ai des dossiers appelés:
Session 1
Session 2
Session 3
Session 4
Session 5
Session 6
Session 7
Session 8
J'aimerais les renommer tous en:
Folder 1
Folder 2
Folder 3
Folder 4
Folder 5
Folder 6
Folder 7
Folder 8
Comment pourrais-je faire cela dans le terminal de la manière la plus efficace?
Je connais les noms mmv
mv
et rename
mais je ne suis pas sûr de ce que je devrais utiliser et comment le faire.
Le moyen le plus simple serait d'utiliser rename
ou prename
name__, qui est un script Perl (si vous êtes une fonction ksh
ou mksh
name__, que Shell utilise la fonction intégrée rename
name__, qui est différente, par conséquent, je l'utilise prename
lorsque vous vous référez à ce script Perl; vous pouvez également appeler /usr/bin/rename
- chemin complet de l'exécutable).
$ ls
Session 1/ Session 2/ Session 3/ Session 4/ Session 5/ Session 6/ Session 7/ Session 8/
$ prename 's/Session/Folder/' Session*/
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
Si vous avez besoin d'une recherche récursive ou assurez-vous de trouver le bon type d'élément (vous avez peut-être aussi des fichiers avec Word "Session" dans le nom du fichier), vous pouvez combiner cela avec l'utilitaire find
name__:
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
$ find -maxdepth 1 -type d -name "Session *" -exec prename 's/Session/Folder/' {} \;
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
Un peu long, peut-être légèrement redondant, mais cela fonctionne.
Le petit problème avec mv
est que nous devons modifier le nom de la destination à chaque fois, afin qu'il ne puisse pas faire ce que nous voulons. Pour ce faire, il faudrait le combiner avec d’autres outils, tels que les outils find
ou bash
name __.
$ ls
Session 1/ Session 2/ Session 3/ Session 4/ Session 5/ Session 6/ Session 7/ Session 8/
$ for dir in Session*/ ; do mv "${dir}" "Folder ${dir##*\ }" ;done
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
Ce que vous voyez ici, c'est que nous parcourons tous les éléments contenant le mot Session
et leur répertoire. Nous utilisons le paramètre de développement `$ {dir ## * \}" pour tout extraire après un espace dans le nom du répertoire (qui correspond au numéro correspondant) et formons la nouvelle chaîne "Folder /".
Dans les deux commandes prename
et mv
name__, nous utilisons globbing, ce qui signifie que ces approches renommeront le répertoire every qui contient le mot "Session", même "Session blah". Bien sûr, ce n’est pas idéal, mais dans le cas particulier où vous savez que le nom de votre dossier est cohérent, cela fonctionnera. Alternativement, nous pourrions augmenter la commande avec for dir in Session\ [1-9] ; do . . .done
.
En d’autres termes, cette approche peut fonctionner, mais elle est très simpliste et n’est pas la meilleure.
Bien entendu, d'autres outils peuvent également être utilisés. Par exemple, Python:
$ ls
Session 1/ Session 3/ Session 5/ Session 7/
Session 2/ Session 4/ Session 6/ Session 8/
$ python -c 'import os,shutil;map(lambda x:shutil.move(x,x.replace("Session","Folder")),os.listdir("."))'
$ ls
Folder 1/ Folder 2/ Folder 3/ Folder 4/ Folder 5/ Folder 6/ Folder 7/ Folder 8/
Allez dans le dossier qui contient tout le dossier que vous voulez renommer et faites:
find . * | rename 's\Session\Folder\'