web-dev-qa-db-fra.com

Renommez plusieurs répertoires dans la ligne de commande

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 mmvmv et rename mais je ne suis pas sûr de ce que je devrais utiliser et comment le faire.

2
Rtsne42

préname

Le moyen le plus simple serait d'utiliser renameou prenamename__, qui est un script Perl (si vous êtes une fonction kshou mkshname__, que Shell utilise la fonction intégrée renamename__, qui est différente, par conséquent, je l'utilise prenamelorsque 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 findname__:

$ 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.

mv

Le petit problème avec mvest 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 findou bashname __.

$ 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 Sessionet 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 prenameet mvname__, 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.

Python

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/
9
Sergiy Kolodyazhnyy

Allez dans le dossier qui contient tout le dossier que vous voulez renommer et faites:

find . * | rename 's\Session\Folder\'
0
Emilio Galarraga