renommer dossiers AA BB => BB AA

5 réponses
Avatar
Didier
Bonsoir la Libre Foule,

Dans un répertoire j'ai un grand nombre de sous-répertoires
nommés "AA BB" ou "AA BB CC" (donc avec une ou plusieurs espaces)
que j'aimerais renommer "BB AA" ou "BB CC AA". Certains se
nomment juste "AA" et resteraient inchangés.
Mon premier outil envisagé est bash, mais sans exclusivité,
je connais (très mal) python.
En bash, comment simplement manipuler des chaÍ®nes et repérer
les séparateurs ?
Vous l'aurez compris, ce sont ici des répertoires "prénom nom".
Mais ça pourrait être bien autre chose ;)

--
ma céramique : http://didierdescamps.fr
autres bouts de vie : http://didierdescamps.free.fr
--

5 réponses

Avatar
Olivier Miakinen
Bonjour,
Le 22/05/2022 23:59, Didier a écrit :
Dans un répertoire j'ai un grand nombre de sous-répertoires
nommés "AA BB" ou "AA BB CC" (donc avec une ou plusieurs espaces)

Il est généralement considéré comme une mauvaise pratique de mettre
des espaces dans les noms de fichiers ou de répertoires, en tout cas
lorsqu'on veut pouvoir les manipuler ensuite en ligne de commande.
Cela dit, rien ne l'interdit, c'est juste plus compliqué Í  manipuler.
que j'aimerais renommer "BB AA" ou "BB CC AA". Certains se
nomment juste "AA" et resteraient inchangés.

Tout dépend si c'est une manip que tu auras Í  faire régulièrement, ou
bien si c'est juste Í  faire une seule fois, parce que tu t'es rendu
compte que tu as mal nommé tes répertoires mais qu'ensuite tu n'y
toucheras plus.
Si c'est le second cas, je ne m'embêterais pas avec un programme bash,
j'utiliserais un script manipulé dans vim.
Voici d'abord mon jeu de tests :
$ mkdir 'A" "AA" "A b" "A b c" "AA bb" "AA bb cc" "AAA bbb" "AAA bbb ccc"
$ ls -1d *
A
AA
'AAA bbb'
'AAA bbb ccc'
'AA bb'
'AA bb cc'
'A b'
'A b c'
D'abord je mets tous les noms avec espace dans un fichier :
$ ls -1d *" "* > moveit
Puis dans vim je fais :
:%s/([^ ]*) (.*)/mv "&" "2 1"/
Le contenu de moveit devient alors :
mv "AAA bbb" "bbb AAA"
mv "AAA bbb ccc" "bbb ccc AAA"
mv "AA bb" "bb AA"
mv "AA bb cc" "bb cc AA"
mv "A b" "b A"
mv "A b c" "b c A"
Et il suffit d'exécuter le script :
$ sh moveit
$ ls -1d *
A
AA
'b A'
'bb AA'
'bbb AAA'
'bbb ccc AAA'
'bb cc AA'
'b c A'
moveit
$ rm moveit
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 23/05/2022 00:38, j'écrivais :
[une méthode compliquée]

Il y a beaucoup plus simple :
$ ls -1d *
A
AA
'AAA bbb'
'AAA bbb ccc'
'AA bb'
'AA bb cc'
'A b'
'A b c'
$ rename 's/([^ ]*) (.*)/$2 $1/' *" "*
$ ls -1d *
A
AA
'b A'
'bb AA'
'bbb AAA'
'bbb ccc AAA'
'bb cc AA'
'b c A'
--
Olivier Miakinen
Avatar
Sergio
Le 22/05/2022 Í  23:59, Didier a écrit :
Bonsoir la Libre Foule,
Dans un répertoire j'ai un grand nombre de sous-répertoires
nommés "AA BB" ou "AA BB CC" (donc avec une ou plusieurs espaces)
que j'aimerais renommer "BB AA" ou "BB CC AA". Certains se
nomment juste "AA" et resteraient inchangés.
Mon premier outil envisagé est bash, mais sans exclusivité,
je connais (très mal) python.
En bash, comment simplement manipuler des chaÍ®nes et repérer
les séparateurs ?
Vous l'aurez compris, ce sont ici des répertoires "prénom nom".
Mais ça pourrait être bien autre chose ;)

Fait un tour du cÍ´té de la commande "rename"... pour repérer les espaces entoure les de " ou échappe-les avec un .
renane 's/ //'
--
Serge http://cahierdesergio.free.fr/
Soutenez le libre: http://www.framasoft.org
Avatar
Jacques L'helgoualc'h
Le 23-05-2022, Sergio a écrit :
Le 22/05/2022 Í  23:59, Didier a écrit :
Bonsoir la Libre Foule,


Bonjour,
[...]
Fait un tour du cÍ´té de la commande "rename"... pour repérer les
espaces entoure les de " ou échappe-les avec un .
renane 's/ //'

au lieu de supprimer, je préfère remplacer les espaces consécutifs par un tiret bas :
rename -d 's/s+/_/g' /chemin/intact/"noms affligés de blancs divers"
=> /chemin/intact/"noms_affligés_de_blancs_divers"
(si on parle bien du rename Perl). Le s+ avalera plus ou moins les
pires mélanges d'espaces, tabs, etc. --- sauf l'insécable :
$ printf 'inséc able tt t z' |perl -e 'while(<>){s/s+/_/g;print $_,"n"}'
inséc able_z
Pour les « prénoms noms », je me méfierais des prénoms composés, noms
doubles et autres aristocrates...
Pour le tri alphabétique, il peut être commode de remplacer
« prénom(s) nom Í  tiroir » par « Tiroir, tout le reste »,
rename -d 's/^(.*S)s+(S+)$/$2, $1/;s/s+/_/g;s/_+$//'
mais il restera des exceptions comme « Henry Ford III » ou « Alexandre
Dumas fils » :/
Avatar
Didier
Le 23/05/2022 Í  00:51, Olivier Miakinen a écrit :
$ rename 's/([^ ]*) (.*)/$2 $1/' *" "*Impec Í  99% !

Comme dit Jacques, certains noms improbables sont maltraités,
mais c'est une toute petite minorité.
Didier.
--
ma céramique : http://didierdescamps.fr
autres bouts de vie : http://didierdescamps.free.fr
--