IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Renommer des dossiers et fichiers.


Sujet :

Shell et commandes POSIX

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2019
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Renommer des dossiers et fichiers.
    Bonjour, et félicitation pour votre site.

    J'ai décidé de changer de cloud et de transféré l'ensemble de mes données vers le cloud OneDrive chez qui j'ai souscrit un abonnement. Après installation et paramétrage des dossiers à sauvegarder sur mon Mac, il s'est mis au travail jusque là pas de problème.

    Mais après un moment il m'affiche le message disant ceci*: "
    Certains fichiers et dossiers listé ci-dessous ne pourrons être synchronisé. Pour qu'ils le soit, des conditions doivent être respecté.
    - Condition 1*: les noms de fichiers ne doivent pas commencé ou se terminer par un espace.
    - Condition 2*: Ils ne doivent pas se terminer par un point.
    - Condition 3*: Ils ne doivent pas commencer par deux points.
    - Condition 4*: Ils ne doivent inclure aucun des caractères suivant /\:*?"<>|

    Après recherche j'en ai déduit qu'un script bash serait plus approprier pour réglé ce problème.
    Je vous soumet ma solutions et souhaiterai une correction de votre part si nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in *.*; do fn=`echo $f | sed 's///-/g'`; mv "$f" "$fn"; done
    J'ai l'intention de répété cet exemple pour chaque caractère /\:*?"<>|
    Par contre pour le reste je n'ai pas d'idée.

    Merci d'avance à la communauté.

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    / étant le séparateur dans un nom de fichier, ce caractère est nécessairement interdit.

    Pour les autres, voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ls
    fic  fic<  fic>  fic|  fic   fic:  fic?  fic"  fic*  fic\  fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ find -name "*[\\\*<>|:?\" ]*"
    ./fic|
    ./fic:
    ./fic?
    ./fic<
    ./fic\
    ./fic>
    ./fic"
    ./fic*
    ./fic
    Tu trouveras vite tous les fichiers qui posent problème.
    "find" explore, tout seul, les sous-dossiers.
    Attention, un des fichiers finit par un espace.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2019
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci Flodelarab pour ton aide. Je t'avoue que je débute dans les regex bash sous OSX. Mon code ne fonctionne pas en faite. Je tente de comprendre pourquoi cette ligne de code ne fonctionne pas avant d'utilisé ta solution. Car je préffèrerais qu'un petit bout de script trouve les fichiers et dossier mal formaté et corrige le problème.

    1) Par contre Ecris comme ceci cela fonctionne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in *; do fn=`echo $f | sed 's/%3a/-/g'`; mv "$f" "$fn"; done
    Je ne sais pas si c'est lors du changement de cloud, mais je retrouve ce genre de chaîne de caractère "%3a" dans les dates placé dans les noms de fichiers. Exemple : "Photo du 01/08/2019" s'affiche dorénavant comme : "Photo du 01%3a08%3a2019". Je sais que c'est une érreur d'utilisé les "/" dans les noms de fichiers et dossiers, mais je n'en suis pas le responsable, et je dois quand même trouvé une solution. Bizarement les / sont utilisable dans les noms de fichier sur Mac. Donc cette ligne de code ci dessus fonctionne bien pour rectifier ce problème. Voila au moins une chose de réglé.

    2) Je précise que j'ai changé également le début du code pour que les modifications de noms ne concerne pas que les fichiers mais également les dossiers.
    J'ai donc remplacé le par 3) J'ai également constaté que les espaces au début des noms de fichier et dossier son éliminés sans que je n'ai eu à placé quoi que ce soit comme code pour cette opération. Tant mieux même-ci je n'ai pas compris pourquoi.

    4) Même après recherche je n'ai pas compris la fonction du g présent dans cette ligne que j'ai prise a cette adresse : dans la partie "Exemples concrets - Renommer des fichiers" très visible sur ce site : https://buzut.net/la-commande-sed-pour-les-nazes/.

    5) pour revenir a cette ligne de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in *.*; do fn=`echo $f | sed 's///-/g'`; mv "$f" "$fn"; done
    j'ai tenté d'échapé ce "/" avec un "\" mais rien n'y fait. Car j'ai principalement une érreur sous Terminal OSX "bad flag in substitute command: '-'"Je me demande si ce ne serai pas OSX qui serait peut-être différent sur les regex face aux linux.

    6) J'ai tenté d'utilisé le style "Commandes groupées" exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/^#/ {y/éèê/eee/;s/Dupond/Dupont/g}' fichiersource.txt
    en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in *; do fn=`echo $f | sed 's/%3a/-/;s///-/g'`; mv "$f" "$fn"; done
    Mais cela ne fonctionne pas.

    Merci d'avance à tout ceux qui pourront m'aider.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Citation Envoyé par Paacha Voir le message
    Merci Flodelarab pour ton aide.
    Pouce en l'air.

    Citation Envoyé par Paacha Voir le message
    Je t'avoue que je débute dans les regex bash sous OSX
    Ce ne sont pas des regex mais des caractères joker. Je sais, c'est confondant.
    Par contre, dans "sed" ce sont des regex.

    Citation Envoyé par Paacha Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in *; do fn=`echo $f | sed 's/%3a/-/g'`; mv "$f" "$fn"; done
    Les `backtics` sont dépassés. Il faut les remplacer par $( ).
    Les noms de fichiers doivent être protégés par des "double quotes".

    Citation Envoyé par Paacha Voir le message
    Je ne sais pas si c'est lors du changement de cloud, mais je retrouve ce genre de chaîne de caractère "%3a" dans les dates placé dans les noms de fichiers. Exemple : "Photo du 01/08/2019" s'affiche dorénavant comme : "Photo du 01%3a08%3a2019". Je sais que c'est une érreur d'utilisé les "/" dans les noms de fichiers et dossiers, mais je n'en suis pas le responsable, et je dois quand même trouvé une solution. Bizarement les / sont utilisable dans les noms de fichier sur Mac. Donc cette ligne de code ci dessus fonctionne bien pour rectifier ce problème. Voila au moins une chose de réglé.
    Les deux points étaient le séparateur de dossiers dans les noms de fichier avec chemin chez MacOS. Donc il remplace ce caractère de séparation par son code ASCII (":" = 5810 = 3A16)

    Citation Envoyé par Paacha Voir le message
    2) Je précise que j'ai changé également le début du code pour que les modifications de noms ne concerne pas que les fichiers mais également les dossiers.
    J'ai donc remplacé le par
    On va présupposer que tu n'as pas de fichiers cachés... car sinon, l'étoile les ignorera.

    Citation Envoyé par Paacha Voir le message
    3) J'ai également constaté que les espaces au début des noms de fichier et dossier son éliminés sans que je n'ai eu à placé quoi que ce soit comme code pour cette opération. Tant mieux même-ci je n'ai pas compris pourquoi.
    C'est la faute de la non-protection des noms de fichiers dont j'ai parlé plus haut. En bash, les espaces n'ont pas vraiment d'importance. Donc les commandes suivantes sont équivalentes :
    Citation Envoyé par Paacha Voir le message
    4) Même après recherche je n'ai pas compris la fonction du g présent dans cette ligne
    C'est un drapeau. Il veut dire global. Sinon la commande ne substitue que la première correspondance. En l'occurrence, sans "g", sur 3 tirets, il ne changerait que le premier.

    Citation Envoyé par Paacha Voir le message
    5) j'ai tenté d'échapé ce "/" avec un "\" mais rien n'y fait.
    Ça doit marcher.
    Mais il y a plus simple :
    Citation Envoyé par Paacha Voir le message
    6) Mais cela ne fonctionne pas.
    Évidemment, tu as toujours ton problème d'oblique non-échappée en plein milieu.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2019
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut et merci pour ses corrections.

    Voici ce que contient le dossier test sur lequel je fais des essais : Nom : Capture d’écran 2019-10-28 à 13.14.40.png
Affichages : 620
Taille : 17,2 Ko





    Et voici ma ligne de code après les corrections que j'ai appliqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in *; do fn=$(echo "$f"|sed 's@%3a@-@g;s@\/@-@g'); mv "$f" "$fn"; done


    Maleureusement aucun changement ne ce fait, et j'obtiens ceci :

    Nom : Capture d’écran 2019-10-28 à 13.40.16.png
Affichages : 616
Taille : 14,4 Ko

    Tu m'a montré que je peut utiliser d'autre délimiteurs, merci. Mais dois-je quand même échapper mon "/" par un anti-slash ? Ce qui donne alors : Et puis il faut que je lui indique quel autres caractères à éliminer : /\:*?"<>|
    J'ai pensé à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '@^/@d;@^\@d;@^:@d;@^*@d;@^?@d;@^"@d;@^<@d;@^>@d;@^|@d'
    Je me dit qu'il est surement possible de placé sur une même lignes les ordres de changements, au lieu de codé une ligne par changement comme je l'ai fais ci-dessous. Ais-je tord ?

    Peut-tu encore m'aidé, Je tente d'apprendre et de compprendre.

    Merci.
    Images attachées Images attachées  

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Citation Envoyé par Paacha Voir le message
    Et voici ma ligne de code après les corrections que j'ai appliqué
    La commande paraît suffisamment bonne pour ne pas poser de problème.

    Citation Envoyé par Paacha Voir le message
    Malheureusement aucun changement n'est fais et j'obtiens ceci
    À ta place, je chercherais si un caractère indésirable et non imprimable s'est glissé dans ton code. En effet, sous MacOS, les fins de ligne sont en \r, alors que sous linux \n (et \r\n sous Windows).
    Pour ce faire, utilise, par exemple, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    od -c Renommage-Fichiers.sh
    Si un \r apparaît, il est en trop. Supprime-le(s). Par un "sed" par exemple .

    Autre hypothèse : un nom de fichier pas sympa. Tape echo "$f"; avant la définition de fn. Ainsi, tu sauras le fichier pour lequel cela plante.

    Conseil : tape ceci tant que tu n'es pas sûr de ton code :
    Et enlève le "echo", quand tu es sûr de ce qu'il fait.

    Citation Envoyé par Paacha Voir le message
    Tu m'a montré que je peut utilisé d'autre délimiteurs, merci. Mais dois-je quand même échapé mon "/" par un anti-slash ?
    Non. Tu peux, mais c'est inutile. C'est tout l'intérêt de changer le délimiteur.
    Le code html est plein d'url avec des obliques et les balises fermantes ont des obliques. Si on ne pouvait pas changer le délimiteur, ceux qui font du web s'arracheraient les cheveux.

    Citation Envoyé par Paacha Voir le message
    Je me dit qu'il est surement possible de placé sur une même lignes les ordres de changements, au lieu de codé une ligne par changement comme je l'ai fais ci-dessous. Ais-je tord ?
    Dans la documentation de sed, intéresse-toi aux crochets [ ⛪αβ ] qui permet une liste de caractère possibles. (Pour le coup, c'est comme les caractères joker que j'ai utilisés au début).

    PS: copie-colle le texte plutôt que faire des images.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Je suis sous macos (10.14.6)
    Dans le Finder, lorsque je crée un dossier "A/B" (dans mon $HOME) et que je copie/colle ce dossier dans le Terminal, j'obtiens /Users/jack/A\:B/.
    (On se demande pourquoi il met un backslash!)
    Réciproquement, si je tape mkdir /Users/jack/A:C, j'obtiens un dossier "A/C" dans le Finder.

    Conclusion: les "/" apparaissant dans le Finder sont "remplacés" par des ":" dans le nom Mach et c'est donc le caractère ":" qu'il faut remplacer avec sed ou tr (qui est beaucoup plus simple) pour traiter les fichiers comme "Photo du 01/08/2019".
    D'ailleurs le caractère ":" est interdit dans les noms de fichier dans le Finder. Logique.

    Je crois me souvenir que c'est le cas depuis mac os X.
    Je crois aussi vaguement me souvenir que, sous mac os 9 et les précédents, c'était plus compliqué...

  8. #8
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2019
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut,
    Après une longue pause, je revient sur ce problème qui n'est pas encore tout a fait réglé mais sur lesquels je fait des progrès . Je te remercie Flodelarab pour les avancées. Je remercie aussi jack-ft pour ton explication, car effectivement les ":" remplace les "/" sous OSX, et effectivement mon script fonctionne maintenant.

    Je cherche maintenant à ce que le traitement soit récursif. Qu'il atteigne les fichiers et les dossiers des sous dossiers et ce sans sans limites.

    Sur les conseils de Flodelarab je me suis aussi intéressé aux crochets "[]" qui s'appellent "Les classes de caractères" dans leurs utilisations, ainsi qu'au signe pipe "|" qui symbolise "ou" dans l’expression des regex.

    Les crochets "[]" permettent d'y stipulé tout les caractères qui devrons être changer, et le pipe "|" allié au "^" permet d'apporté une précision sur ce caractère pour stipulé qu'il devra se trouver en début de chaîne.

    J'apporte ses informations obtenu après recherche, pour celui qui viendrait après moi et souhaiterait comprendre.

    Voici le script avec les dernières modifications (sans la récursivité).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in *; do fn=$(echo "$f"|sed 's#[:*?"<>|^:]#-#g'); mv "$f" "$fn"; done
    Merci de m’aidé pour ce qui manque (la recusivité) svp.

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    pour ce qui manque (la recusivité) sep.
    find est naturellement récursif.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. liste déroulante + liste des dossiers et fichiers
    Par marxia4849 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 27/03/2013, 11h55
  2. [PowerShell] Parcourir des dossiers et fichiers et extraire les données
    Par WarriorExtreme dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 23/03/2012, 15h50
  3. [XL-2007] Amélioration - Macro Liste des Dossiers et Fichiers - Colonne en ligne
    Par Shadoward dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/08/2009, 05h47
  4. Synchroniser des dossiers et fichiers sur une clé USB
    Par kilian67 dans le forum Windows XP
    Réponses: 5
    Dernier message: 01/12/2008, 17h24
  5. indexation des dossier et fichier
    Par stephane543 dans le forum C++
    Réponses: 9
    Dernier message: 08/05/2008, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo