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 GNU Discussion :

ls finder bash sort : tris différents des fichiers


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Par défaut ls finder bash sort : tris différents des fichiers
    Bonjour à tous

    Voici tout de suite mon problème.

    J'ai une suite de fichier nommé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fichier001
    fichier0001
    fichier00001
    fichier00002
    fichier0000100
    fichier00001000
    ...
    J'aimerai procédé a un renommage de tout ces fichiers en bash d'après un listing.
    Le script prend le 1er fichier et le renomme avec le 1er nom du listing et ainsi de suite

    Mon problème est que l'ordre affiché dans ma fenêtre n'est pas le même que si je fais un lscomme mon script utilise un ls et une boucle, le remplacement du nom de fichier ne se fait pas sur le bon fichier.
    Quand je fais un sort -n, l'ordre n'est pas le même non plus.

    extrait du script utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ls monChemin/ >classeTemp.txt
     
                    for ((i=1 ; NombreFichier+1 - $i ; i++))
                    do
                            nomPhotoOriginal=$(cat classeTemp.txt | head -n $i | tail -n 1)
                            nomPhotoFinal=$(cat $listing | head -n $i | tail -n 1)
                            mv monChemin/$nomPhotoOriginal monChemin/$nomPhotoFinal".jpg"
                    done


    Quelqu'un a-t-il une solution ?

    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Par défaut
    Bonjour,

    Citation Envoyé par niroub Voir le message
    Mon problème est que l'ordre affiché dans ma fenêtre n'est pas le meme que si je fais un 'ls'
    De quelle fenêtre parles tu ?

    Sinon, pour la boucle, peut-être plutôt quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rep=monChemin
    for fic in "$rep"/*
    do
        read -ru 3 || break # on sort de la boucle si tous les noms de fichiers dans $listing ont été consommés
        mv "$fic" "$rep/$REPLY.jpg"
    done 3< "$listing"

    Citation Envoyé par niroub
    mv monChemin/$nomPhotoOriginal monChemin/$nomPhotoFinal".jpg"
    Là, tu places les guillemets au seul endroit où il n'y en a pas besoin !

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Quand je fais un sort -n , l'ordre n'est pas le meme non plus.
    Ah ça c'est sûr ! Quand tu changes le type de tri, tu changes le résultat. Tu comprends ce que tu fais, ou bien ?...

    sort -n est un classement en considérant les valeurs numériques. "3" est devant "12" numériquement mais derrière alphabétiquement.

    D'autre part, voici une source d'inspiration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while IFS='' read -r lineFic1 <&3 && IFS='' read -r lineFic2 <&4 ; do echo "mv $lineFic1 $lineFic2"; done 3<fic1.txt 4<fic2.txt
    Autre idée:
    Si tu utilises tail et head pour avoir la ième ligne, utilise plutôt sed.
    Exemple pour avoir la 17ème ligne d'un fichier texte:
    ou
    (au fait: cat est inutile.)

    Enfin, on utilises pas ls dans un script. On utilise find ou stat suivant le besoin.
    Cela ne règle pas ton problème d'ordre, mais voilà.

  4. #4
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Par défaut
    Ah ça c'est sûr ! Quand tu changes le type de tri, tu changes le résultat. Tu comprends ce que tu fais, ou bien ?... -->Putin ! toi tu sais parler aux gens ;-)

    Bon je vais essayer de réexpliquer mon problème car je n'ai pas de problème de boucle, meme si je prend en compte votre façon de faire qui est surement meilleure que la mienne.

    Je suis sur mac (oubli de précision) :
    dans ma fenêtre finder, le classement de mes fichiers se fait dans cet ordre : (exemple)

    IMG_6210.jpeg
    IMG_62015412.jpg
    IMG_62045412.jpg
    IMG_62085412.jpg



    Pour renommer ces fichiers, j'ai un listing (de noms) sachant que je fais une boucle pour renommer tous ces fichiers.
    Malheureusement que je fasse une boucle d'après un 'ls' ou meme sous la forme 'for fichier in $' le classement n'est pas bon.
    Donc le renommage ne se fait pas correctement.

    Par exemple dans ce cas "IMG_6210.jpg" se trouve avant "IMG_62015412.jpg" sur ma fenêtre finder.
    Et sur mon 'ls' il se trouve en dernier position (meme avec un sort -n)

    Autre précision tous les fichiers ne commencent pas forcement par IMG_

    Je me dit que mon mac fait un tri d'après un certain ordre et c'est cet ordre qu'il faudrait retrouver. A moins que vous voyez une autre solution.

    Merci

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par niroub Voir le message
    Je suis sur mac (oubli de précision) :
    Précision intéressante!

    Ce forum-ci https://www.developpez.net/forums/f3...commandes-gnu/ est en principe réservé aux utilisateurs pur linux.

    Le forum pour les utilisateurs de la pomme (dont moi!) est plutôt https://www.developpez.net/forums/f1...mmandes-posix/

    Un administrateur déplacera peut-être ton message dans la catégorie adéquate...

    Mais ce n'est pas vraiment fondamental pour ton problème en particulier... une fois le tri déterminé...

    Mais attention!
    Les options du "ls" (POSIX) de macos sont:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SYNOPSIS
         ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1] [file ...]
    Je ne suis pas sûr que ce soient les mêmes que pour les linuxiens

    Oui N_BaH, je sais qu'on ne doit normalement pas utiliser "ls" dans un script, mais ses options de tri sont quand même bien pratiques et plus simples que "find" ou autres...

    dans ma fenêtre finder, le classement de mes fichiers se fait dans cet ordre : (exemple)

    IMG_6210.jpeg
    IMG_62015412.jpg
    IMG_62045412.jpg
    IMG_62085412.jpg

    [snip]
    Je me dit que mon mac fait un tri d'après un certain ordre et c'est cet ordre qu'il faudrait retrouver. A moins que vous voyez une autre solution.
    Nous y voilà!

    C'est le Finder (que je connais bien!) qui affiche les fichiers dans un certain ordre.
    Cet ordre dépend de plusieurs paramètres que tu dois nous transmettre afin que l'on puisse t'aider à déterminer cet ordre.

    D'abord il faudrait que tu nous indiques quel type d'affichage tu utilises:
    - icônes
    - liste
    - colonnes
    - Cover Flow

    Tu peux trouver cette information:
    - en regardant le bouton à 4 positions de la fenêtre, à droite du bouton d'historique "< >"
    - en sélectionnant la fenêtre en question (cliquer un coup sur son bandeau), puis en cliquant menu "Présentation" et en regardant lequel des 4 premiers items est sélectionné:
    -- Par icônes
    -- Par liste
    -- Par colonnes
    -- Sous forme de Cover Flow


    À suivre...

  6. #6
    Membre éprouvé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Par défaut
    Bonjour,

    Et les fichiers IMG_*.jpg, il sont bien placés avant les fichiers TOTO_*.jpg par exemple ?
    Si c'est le cas, j'ai l'impression que finder fait un mix de tri alphabétique et de tri numérique.

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 348
    Par défaut
    Bonjour,

    Et pourquoi ne pas trier les 2 parties, comme ça, on ne se pose pas de question.

    Sinon, par défaut, ls ou le globbing * (coté bash) font un tri alphabétique qui peut aussi être insensible à la casse selon la locale utilisée (il est donc fortement conseillé d'utilisé la locale C pour ce genre d'action).

    find, ne trie pas, il traite par ordre d'arrivé sur le disque.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par Postmortem Voir le message
    Et les fichiers IMG_*.jpg, il sont bien placés avant les fichiers TOTO_*.jpg par exemple ?
    Si c'est le cas, j'ai l'impression que finder fait un mix de tri alphabétique et de tri numérique.
    Oui, si l'on suppose que la fenêtre Finder est ouverte en mode "Par liste" et que la colonne "Nom" contient la flèche de tri active, on a effectivement un tri spécial...

    Si aucun nom de tes fichiers ne contient de caractères spéciaux (espace, tabulation, return), alors tu peux utiliser l'astuce suivante (trouvée sur 65bits.com):

    Dans la fenêtre Finder, tu presses cmd-A puis cmd-C et tu stockes alors la liste de tes fichiers dans le presse-papiers, que tu conserves le temps de la coller à l'intérieur du script suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    i=1
    for nomPhotoOriginal in cmd-V
                    do
                            nomPhotoFinal=$(sed -n "${i}p" "${listing}")
                            mv "${nomPhotoOriginal}" "monChemin/${nomPhotoFinal}.jpg"
                            ((i++))
                    done
    En remplaçant la chaîne "cmd-V" dans le script par le résultat du collage via la commande "cmd-V"!

    Oui, je sais, c'est du codage en dur, mais, manifestement, la liste des noms de remplacement est aussi codée en dur!

    PS: on peut faire plus propre, mais il faut alors passer par "osascript" que je ne maîtrise que très très peu.
    et comme, de toute façon, la liste de remplacement est codée en dur...

    Remarque: Si le nom de certains fichiers contient des espaces, tu peux coller le contenu de ton presse-papiers dans un fichier "classeTemp.txt", puis faire (merci Flodelarab):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gsed -e 's|\([^\]\) |\1\n|g' "classeTemp.txt" \
     | while IFS='' read -r nomPhotoOriginal && IFS='' read -r nomPhotoFinal <&4
        do echo mv "${nomPhotoOriginal}" "monchemin/${nomPhotoFinal}.jpg"
    done 4<"${listing}"
    en utilisant "gsed" (GNU sed), normalement disponible sur mac (ou installable)...

    et en supprimant le "echo" si ça te convient.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par niroub Voir le message
    Mon problème est que l'ordre affiché dans ma fenêtre n'est pas le meme que si je fais un 'ls'
    Quel est l'ordre affiché dans ta fenêtre?
    Ou, plus précisément, dans quel ordre souhaites-tu énumérer tes fichiers?

    PS: si, dans ta fenêtre, tu affiches des icônes que tu as toi-même triées à la main, àmha ça va pas être facile!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/03/2017, 22h18
  2. Requete donnant une liste uniquement de résultats différents
    Par Ricardo_Tubbs dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/03/2006, 11h12
  3. Remplir 3 champs textes différents avec une liste déroulante
    Par azorol dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/12/2005, 00h04
  4. Même liste sur 26 pages différentes
    Par krfa1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 18/03/2005, 11h32
  5. Réponses: 6
    Dernier message: 28/02/2005, 12h10

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