Rechercher - Remplacer sous Unix

Taho!

Membre d’élite
Club MacG
9 Octobre 2001
4 404
558
40
Grenoble
www.pomme-grenette.org
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

-Duck Warrior-
Modérateur
Club MacG
18 Octobre 2001
13 868
1 719
Angoulême
ça concerne effet MacOS, mais si tu veux des réponses (pas rapides, mais des réponses tout de même) et que ton post ne soit pas dejà au fin fond des oubliettes à la fin de la journée il vaut mieux poster ça dans Unix ;)
Aller, je déplace :D:D
 

Eymerich

Membre junior
5 Avril 2003
61
3
53
Paris
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

-Duck Warrior-
Modérateur
Club MacG
18 Octobre 2001
13 868
1 719
Angoulême
Ce que voudrait Taho!, c'est renommer tous les fichier/ré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étences s'arrêtent là :confused:
 

Taho!

Membre d’élite
Club MacG
9 Octobre 2001
4 404
558
40
Grenoble
www.pomme-grenette.org
(merci Daffy)
j'aime bien comprendre les commandes et je n'ai pas vu où spécifier le dossier concerné par la recherche parce que je ne veux pas faire ça pour mon disque système, mais juste pour le disque de données.
ce que je veux rechercher/remplacer c'est ":" (deux points) par " " (espace)

tu pourrais décrire un peu ton script donc que je le comprenne un peu mieux ?
 

olof

Membre émérite
23 Avril 2002
770
103
48
Neuchâtel
www.olofweb.com
A priori, je partirais dans cette direction :

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

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

hegemonikon

Membre émérite
5 Septembre 2001
991
185
48
Collioure
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
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érant que ça puisse t'aider.





 

Taho!

Membre d’élite
Club MacG
9 Octobre 2001
4 404
558
40
Grenoble
www.pomme-grenette.org
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
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érant que ça puisse t'aider.





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

Membre émérite
5 Septembre 2001
991
185
48
Collioure
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!

Membre d’élite
Club MacG
9 Octobre 2001
4 404
558
40
Grenoble
www.pomme-grenette.org
Et bien si ça c'est pas de la réponse précise et exacte !!

Merci beaucoup Hegemonikon ! :love:

Vous devriez donner des points de réputation à d'autres avant d'en offrir de nouveau à hegemonikon.
 

hegemonikon

Membre émérite
5 Septembre 2001
991
185
48
Collioure
il faut aussi remplacer:
REPLACE_CHAR=":"
par
REPLACE_CHAR="1"
pour sed s/1/2/g
 

Taho!

Membre d’élite
Club MacG
9 Octobre 2001
4 404
558
40
Grenoble
www.pomme-grenette.org
OK, ç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, ça tourne, je vous tiens au courant...
Merci encore :love:
 

daffyb

-Duck Warrior-
Modérateur
Club MacG
18 Octobre 2001
13 868
1 719
Angoulême
Taho! a dit:
(...)

Merci beaucoup Hegemonikon ! :love:

Vous devriez donner des points de réputation à d'autres avant d'en offrir de nouveau à hegemonikon.
Je me charge de lui règler son compte :D
Taho! a dit:
Le soucis du Terminal est que je sais pas ce qu'il fait... pour le moment, ça tourne, je vous tiens au courant...
Laisse faire, ça peut-être long ;)
 

Taho!

Membre d’élite
Club MacG
9 Octobre 2001
4 404
558
40
Grenoble
www.pomme-grenette.org
Ç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 !
 

FjRond

Membre émérite
16 Février 2004
797
14
63
Vendée
homepage.mac.com
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 ?
Bloc de code:
$ diskutil repairPermissions disk1
Bloc de code:
$ diskutil repairDisk disk1
 

Taho!

Membre d’élite
Club MacG
9 Octobre 2001
4 404
558
40
Grenoble
www.pomme-grenette.org
Bonne idée, mais je le vois aussi dans Utilitaire de disque. J'ai déjà tenté des réparations qui n'ont rien donné. Mon but est de sauvegarder ce disque. La création d'une image disque a foiré (bibliothèque HE comme dit dans mon premier post).

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

Une info à 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. Ç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ême très intéressé par des réponses à mes questions ci-dessus...
 

Eymerich

Membre junior
5 Avril 2003
61
3
53
Paris
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

Membre émérite
16 Février 2004
797
14
63
Vendée
homepage.mac.com
Eymerich a dit:
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.
Concis et efficace. :up: