# Rechercher - Remplacer sous Unix



## Taho! (11 Octobre 2005)

Avant propos : _OK, je vais vous bourrer le mou avec du Shell, et pourtant, je trouve que ça concerne beaucoup MacOS X qui a quelques commandes particulières. De plus, c'est vraiment un problème OS X, si j'utilise le terminal, c'est pour me sauver la vie !_

J'ai un disque dur qui monte sur le bureau mais que je ne peux explorer. Dès que je l'ouvre, le Finder plante. Le Terminal me permet de naviguer dedans. J'ai même pu lancer une copie avec la commande cp (pas de système, juste un disque de sauvegarde). 

Sauf que... Je ne sais pas quelle... connerie (je peux pas appeler ça un miracle), beaucoup de fichiers contiennent des ":" et ce caractère là est, sous MacOS 9, le séparateur de hiérarchie, comme le / en Unix. Et donc, il ne comprend pas ces documents et les zape en disant que le chemin est trop long.

Et me voici donc parti à faire des commandes mv au kilomètre pour renommer ces fichiers. Sauf que passée la première vingtaine de fichiers, j'en ai marre ! 

Existe-t-il donc un moyen de renommer les fichiers d'une commande. Genre demander à remplacer tous les ":" par " " afin que je puisse finir ma sauvegarde...


----------



## daffyb (11 Octobre 2005)

&#231;a concerne effet MacOS, mais si tu veux des r&#233;ponses (pas rapides, mais des r&#233;ponses tout de m&#234;me) et que ton post ne soit pas dej&#224; au fin fond des oubliettes &#224; la fin de la journ&#233;e il vaut mieux poster &#231;a dans Unix 
Aller, je d&#233;place


----------



## Eymerich (11 Octobre 2005)

Jen'aipastoutsaisimaissituveuxsousunshellrenommerautomatiquement  
des fichiers tu peu faire une script du style

#!/bin/bash
i=1
for name in ls  ; do
mv $name $name$i
i=`expr $i + 1`
done

il va parcourir tous les fichiers tu répertoire courant et les renommer en ajoutant un chiffre.

modifier la commande mv selon les souhait de renommage

Ey.


----------



## daffyb (11 Octobre 2005)

Ce que voudrait Taho!, c'est renommer tous les fichier/r&#233;pertoires avec un : dans le nom par par exemple _
En gros, faire un rechercher : remplacer _
Il doit bien avoir un moyen avec un find et un grep, mais mes comp&#233;tences s'arr&#234;tent l&#224;


----------



## Taho! (11 Octobre 2005)

(merci Daffy)
j'aime bien comprendre les commandes et je n'ai pas vu o&#249; sp&#233;cifier le dossier concern&#233; par la recherche parce que je ne veux pas faire &#231;a pour mon disque syst&#232;me, mais juste pour le disque de donn&#233;es.
ce que je veux rechercher/remplacer c'est ":" (deux points) par " " (espace)

tu pourrais d&#233;crire un peu ton script donc que je le comprenne un peu mieux ?


----------



## olof (11 Octobre 2005)

A priori, je partirais dans cette direction :

find /point-de-d&#233;part -name '.*:.*' -exec ....(avec une regexp qui fait le remplacement)

Lire les pages man, moi j'en connais pas plus...


----------



## hegemonikon (11 Octobre 2005)

Le plus simple est d'utiliser la commande _sed_ je pense.

Le programme suivant permet de remplacer tous les ":" par des  "-" dans les noms de fichiers du r&#233;pertoire courant.
#!/bin/sh
REPLACE_CHAR=":"
for FILE in `find ./ -type f`
do
echo $FILE | grep $REPLACE_CHAR > /dev/null
   if [ "$?" == "0" ]
   then
     mv $FILE `echo $FILE | sed s/:/-/g`
   fi
done
​En esp&#233;rant que &#231;a puisse t'aider.



​
​


----------



## Taho! (11 Octobre 2005)

hegemonikon a dit:
			
		

> Le plus simple est d'utiliser la commande _sed_ je pense.
> 
> Le programme suivant permet de remplacer tous les ":" par des  "-" dans les noms de fichiers du répertoire courant.
> #!/bin/sh
> ...


Je vais essayer ça, mais je n'ai juste pas compris où tu configures l'emplacement où s'applique le script...
Exemple si je veux faire ça dans mon dossier user, je devrais taper : 

for FILE in `find ./Users/taho -type f`

Enfin, je fais un simple copier-coller dans Terminal ?


----------



## hegemonikon (11 Octobre 2005)

Tu enregistre le script dans un fichier (avec Textwrangler par exemple ou dans un terminal avec nano, vi ou emacs) en l'appelant _renomme.sh_ ou autrement.

Tu ouvres un terminal et tu vas où se trouve ton fichier _renomme.sh_
tu tapes:_chmod +x renomme.sh_​pour rendre ton fichier executable.

tu déplaces ton fichier dans /Users/taho:_mv ./renomme.sh /Users/taho_​tu vas dans /Users/taho et tu lances ton script:_cd /Users/taho_
_./renomme.sh_​voilà.

Sinon tu peux aussi laisser le script où tu le souhaites et remplacer:
 for FILE in `find ./ -type f` ​par
 for FILE in `find /Users/taho -type f`​


----------



## Taho! (11 Octobre 2005)

Et bien si &#231;a c'est pas de la r&#233;ponse pr&#233;cise et exacte !!

Merci beaucoup Hegemonikon ! :love:

_Vous devriez donner des points de r&#233;putation &#224; d'autres avant d'en offrir de nouveau &#224; hegemonikon._


----------



## Taho! (11 Octobre 2005)

pour tester quand m&#234;me avant, j'ai fait un sed s/1/2/g sur un dossier qui s'appelle 1
et &#231;a n'a pas march&#233;...


----------



## hegemonikon (11 Octobre 2005)

il faut aussi remplacer:
 REPLACE_CHAR=":"
​par
REPLACE_CHAR="1"​pour  sed s/1/2/g


----------



## Taho! (11 Octobre 2005)

OK, &#231;a marche bien pour mon fichier de test
je viens de le lancer sur mon disque pour voir.
Le soucis du Terminal est que je sais pas ce qu'il fait... pour le moment, &#231;a tourne, je vous tiens au courant...
Merci encore :love:


----------



## daffyb (11 Octobre 2005)

Taho! a dit:
			
		

> (...)
> 
> Merci beaucoup Hegemonikon ! :love:
> 
> _Vous devriez donner des points de r&#233;putation &#224; d'autres avant d'en offrir de nouveau &#224; hegemonikon._


 Je me charge de lui r&#232;gler son compte 


			
				Taho! a dit:
			
		

> Le soucis du Terminal est que je sais pas ce qu'il fait... pour le moment, &#231;a tourne, je vous tiens au courant...


Laisse faire, &#231;a peut-&#234;tre long


----------



## Taho! (11 Octobre 2005)

Bon, &#231;a tourne mais j'ai pas mal de fichiers en erreur quand m&#234;me
je vais quand m&#234;me devoir en faire &#224; la main 
je laisse tourner...


----------



## Taho! (11 Octobre 2005)

&#199;a tourne depuis 14h30 et c'est toujours pas fini
j'ai aussi une quantit&#233; ph&#233;nom&#233;nale de "no such file or directory", &#224; savoir que le disque en question ne fonctionne pas bien du tout (Biblioth&#232;que vautr&#233;e)...
Je verrais &#231;a demain matin si le disque est encore vivant apr&#232;s ce traitement de choc !


----------



## FjRond (12 Octobre 2005)

Taho! a dit:
			
		

> Ça tourne depuis 14h30 et c'est toujours pas fini
> j'ai aussi une quantité phénoménale de "no such file or directory", à savoir que le disque en question ne fonctionne pas bien du tout (Bibliothèque vautrée)...
> Je verrais ça demain matin si le disque est encore vivant après ce traitement de choc !


Pourquoi ne pas tenter de réparer le disque, puisqu'il apparaît normalement dans le terminal ?

```
$ diskutil repairPermissions disk1
```


```
$ diskutil repairDisk disk1
```


----------



## Taho! (12 Octobre 2005)

Bonne id&#233;e, mais je le vois aussi dans Utilitaire de disque. J'ai d&#233;j&#224; tent&#233; des r&#233;parations qui n'ont rien donn&#233;. Mon but est de sauvegarder ce disque. La cr&#233;ation d'une image disque a foir&#233; (biblioth&#232;que HE comme dit dans mon premier post).

Bon, j'ai 10 pages de fichiers non renomm&#233;s et donc ma copie via cp plante toujours. J'ai possibilit&#233; de faire une copie brute sans qu'il se pose de questions ?

Une info &#224; tout hasard. Comme je n'ai pas de place sur mon disque interne et que je ne peux en brancher un de plus en interne (ou en externe), je fais la copie vers un volume SMB. &#199;a peut jouer ?

Ah pardon, je viens de retrouver un disque dur interne que je vais m'empresser de connecter en FireWire. Je fais le test et je vous tiens au courant, mais je suis quand m&#234;me tr&#232;s int&#233;ress&#233; par des r&#233;ponses &#224; mes questions ci-dessus...


----------



## Eymerich (13 Octobre 2005)

Objectif compris:

en bash le script suivant est un peu plus simple

#!/bin/bash
for f in *:*; do mv $f ${f//:/-}; done

a la place de sed il utilise la fonction de substitution globale de bash

Ey.


----------



## FjRond (14 Octobre 2005)

Eymerich a dit:
			
		

> Objectif compris:
> 
> en bash le script suivant est un peu plus simple
> 
> ...


Concis et efficace.


----------

