#1 Le 08/05/2008, à 15:49
- gadjou
[Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Bonjour,
J'ai une structure de répertoire comme cela:
.
!-a
!--1
!--2
!-b
!-c
!--1
!--2
je voudrais faire un script pour remonter tous les répertoire de niveau 2 (les chiffres) un niveau plus haut sous la forme:
.
!-a1
!-a2
!-b
!-c1
!-c2
Le problème est que les répertoire peuvent contenir des espaces, et c'est la que je bloques.
Quelqu'un pourrait me donner une piste? Merci
Dernière modification par gadjou (Le 09/05/2008, à 07:41)
Hors ligne
#2 Le 08/05/2008, à 19:31
- lolobu
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Un petit script python (pas réussi en bash s'il y a des espaces dans les noms)
#!/usr/bin/env python
from glob import glob
import os
dirLevel1=glob('*')
for dir1 in dirLevel1:
dirLevel2=glob(os.path.join(dir1,'*'))
for dir2 in dirLevel2:
if os.path.isdir(dir2):
newDir2 = os.path.dirname(dir2)+os.path.basename(dir2)
print "MOVE : %s\n\tINTO : %s"%(dir2,newDir2)
os.rename(dir2,newDir2)
if not glob(os.path.join(dir1,'*')):
print "Delete empty dir : " + dir1
os.removedirs(dir1)
Je te conseil d'essayer dans un premier temps en mettant # devant la ligne os.rename pour voir si les print ne sont pas debiles et que ca ne va pas tout casser. J'ai testé sur un exemple chez moi mais bon ... on n'est jamais trop prudent.
Hors ligne
#3 Le 08/05/2008, à 20:10
- Alain.g
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Salut
Pour les espaces, il faut mettre les variables entres guillemets, ce qui empêche également l'interprétation des caractères spéciaux qui seraient éventuellement contenus dans les noms de fichier
Pour ta demande, quelque chose comme cela en bash pourrait peut-être convenir :
for i in */*/ ; do mv "$i" "${i/\//}" ; done
Place un "echo" devant "mv" pour voir avant si ça correspond à ce que tu veux
Dernière modification par Alain.g (Le 08/05/2008, à 20:15)
Xubuntu Karmic !
Hors ligne
#4 Le 08/05/2008, à 20:56
- lolobu
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Ah oui, c'est beaucoup mieux. Je ne sais pas ce que j'avais fait avec mes "" car ca ne fonctionnait pas. Par contre il faut faire
for i in */*/ ; do mv "$i" "${i//\//}" ; done
Sinon seul le 1er / et supprimé et du coup il essaye de faire le mv dans un répertoire existant ... qui n'existe pas :-(
Hors ligne
#5 Le 08/05/2008, à 23:32
- yurek
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Pourrait tu expliquer ligne par ligne ton script en python ?
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#6 Le 09/05/2008, à 07:40
- gadjou
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Les 2 solutions (script et python) fonctionne parfaitement. Merci beaucoup.
Hors ligne
#7 Le 09/05/2008, à 08:03
- gadjou
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Pouvez vous m'expliquez ${i//\//} SVP?
Hors ligne
#8 Le 09/05/2008, à 08:50
- Alain.g
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Pouvez vous m'expliquez ${i//\//} SVP?
Tu pourras trouver les explications ici :
http://abs.traduc.org/abs-5.1-fr/ch09s02.html#substringreplacement
${chaine/souschaine/remplacement}
Remplace la première correspondance de souschaine par remplacement.
${chaine//souschaine/remplacement}
Remplace toutes les correspondances de souschaine avec remplacement.
Ce qui n'est pas précisé, c'est que pour supprimer la premier correspondance de souschaine, on peut faire :
"${chaine/souschaine}"
et supprimer toutes les correspondance :
"${chaine//souschaine}"
Donc on aurait pu faire plus simplement "${i//\/}" ou même "${i///}" qui n'a pas l'air de poser problème
Xubuntu Karmic !
Hors ligne
#9 Le 09/05/2008, à 09:26
- lolobu
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Alors les explications du script python ....
dirLevel1=glob('*')
C'est en gros la même chose qu'un ls. Tu récupère dans dirLevel1 toute la liste des fichiers à l'endroit ou tu te trouves.
for dir1 in dirLevel1:
On itère sur cette liste de fichiers (ou répertoires)
dirLevel2=glob(os.path.join(dir1,'*'))
On refait la même chose en listant tous les fichiers sous dir1. On aurait pu faire dirLevel2=glob(dir1+'/*')), la seule différence c'est qu'avec le join, c'est portable quelque soit l'OS (sous windows, le séparateur n'est pas / mais \)
Ensuite on itère à nouveau tout avec dir2.
if os.path.isdir(dir2):
On vérifie que dir2 est bien un répertoire (et pas un fichier ou un lien ...)
newDir2 = os.path.dirname(dir2)+os.path.basename(dir2)
On crée le nouveau nom pour le mv qui va suivre. dirname donne le path et basename la terminaison. Par exemple, si dir2="tmp/titi/cd/file.log", dirname retourne tmp/titi/cd et basename file.log. En gros on a supprimé le / du dernier niveau hiérarchique.
os.rename(dir2,newDir2)
Equivalent de mv en python
Et le dernier bloc c'est pour détecter les répertoires de départ de la list dirLevel1 qui après les mv seraient vides. On les efface, mais seulement si glob(os.path.join(dir1,'*')) est vide.
Pour un tutorial assez simple de python voir Python Tutorial à:
http://www.python.org/doc/2.5.2/download/
Hors ligne
#10 Le 09/05/2008, à 10:05
- gadjou
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Encore merci
Hors ligne
#11 Le 09/05/2008, à 10:31
- yurek
Re : [Resolu] Aide pour script pour remonter les sous-répert d'un niveau
Merci
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne