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 :

Script print propriétaire du fichier et nom fichier (avec une certaine syntaxe)


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut Script print propriétaire du fichier et nom fichier (avec une certaine syntaxe)
    Bonjours,
    auriez vous une idée pour afficher le proprio du fichier et le nom du fichier à l'aide d'un script ? (en envoie ls -l en entrée)

    contenu du dossier:

    toto hello.txt
    titi test1.txt
    toto test2.txt
    tata test3.txt
    toto myscipt.sh

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls  -l | ./myscript.sh "test"
    titi test1.txt
    toto test2.txt
    tata test3.txt

    j'ai esseyé quelque trucs mais rien de concluant..

    j'ai testé : mais : -tous les résultats sont print en meme temps
    -je ne vois absolument pas comment get le user du fichier

    peut etre que je dois aller voir du coté de sed??
    Merci pour vos réponses,

    Bonne journée !

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    un pipe passe les données sur l'entrée standard d'une commande, il faut donc lire (read) ces données, tant que qu'il y a des données (à lire).
    les $1, $2... sont les paramètres positionnels du script : ce qui est passé en argument.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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

    On comprend rien.
    Citation Envoyé par awesomeman Voir le message
    auriez vous une idée pour afficher le proprio du fichier et le nom du fichier à l'aide d'un script ?
    On n'utilise pas ls dans un script.
    Donc déjà, ça règle la question.
    Tourne-toi plutôt vers find ou stat.

    Citation Envoyé par awesomeman Voir le message
    -tous les résultats sont print en meme temps
    Et en quoi est-ce un problème ?

    Citation Envoyé par awesomeman Voir le message
    -je ne vois absolument pas comment get le user du fichier
    Quel fichier ? si tu mets "test*" c'est pas étonnant qu'il y ait plusieurs fichiers avec chacun un propriétaire, éventuellement différent.

    Citation Envoyé par awesomeman Voir le message
    peut etre que je dois aller voir du coté de sed??
    Excellente idée. Mais encore faut-il que tu saches ce que tu veux.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Membre habitué Avatar de silfun1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2015
    Messages : 117
    Points : 187
    Points
    187
    Par défaut
    Bonjour à tous,

    Effectivement, le plus simple serait d'utiliser la comamnde find.
    Si tu souhaites quand meme le faire en bash, il faudrait :
    - Utiliser une boucle for pour parcourir le dossier (for fichier in ./* do .... done).
    - Passer un argument à ton script et utiliser grep pour filtrer le nom des fichiers (echo $fichier|grep tonfiltre)
    - Utiliser la comamnd stat pour récupérer et afficher le nom du propriétaire (stat -c %U $fichier)

    J'ai fait un script qui fonctionne avec ton exemple. Est ce que je te laisse chercher et trouver, ou veux tu que je l'affiche ?

    Sylvain


    L'informatique, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
    - Ne vous privez pas pour voter pour ma réponse si elle vous plaît bien
    - Ne pas hésiter à cliquer sur "Résolu" quand votre problème posé a trouvé une solution. Et un petit merci fait toujours plaisir

  5. #5
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    On comprend rien.
    On n'utilise pas ls dans un script.
    Donc déjà, ça règle la question.
    Tourne-toi plutôt vers find ou stat.
    ...
    Pourquoi ne pas utiliser ls ?
    Si on a peur des effets de la localisation, il suffit de mettre "export LANG=C" en tête du script.

    je vous propose cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    ~$ ls -l | awk '{print $3 " " $9}'
     
    raph adresse.html
    raph archives
    raph C
    raph Desktop
    raph divers
    raph Documents
    raph Downloads
    raph impots
    raph IT
    raph maison
    raph memo_perso2.odt
    raph Music
    raph Pictures
    raph PSE
    raph Public
    raph retraite
    raph sysAdm
    raph Templates
    raph Videos
    ~$
    IMHO, you should RTFM ASAP. IHTH.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    pourquoi se compliquer la tâche, lorsque stat peut le faire en une seule commande ?!
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    je voulais juste faire ca enfait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    if [ -z "$1" ]
    then
           awk '{if (NR!=1) print $3"\t"$9}'
    else
          awk '{if (NR!=1) print $3"\t"$9}' | grep -F $1*
    fi
    Bonne journée !

  8. #8
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    c'est clair que tu exprimes très mal ta question, mais bon si tu t'es compris et que t'as trouvé la réponse tant mieux

    plus simple que ton script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/bash
    awk -vregex="$1" 'NR > 1 && $0 ~ regex {print $3 "\t" $9}'

  9. #9
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    non ce que tu propose cherche dans toute la string or je dois juste check si la string commence par le paramètre. pas si le paramètre est contenu dans la string .
    par contre j'ai un petit problème .. si c'est un dossier le grep m'affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep: dir: est un dossier
    je tape cette commande la : ls -l | ./script.sh "d"

  10. #10
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par awesomeman Voir le message
    non ce que tu propose cherche dans toute la string or je dois juste check si la string commence par le paramètre. pas si le paramètre est contenu dans la string .
    ah ben du coup ta solution n'est pas bonne non plus alors

    du coup en modifiant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/bash
    awk -vregex="$1" 'NR > 1 && $9 ~ "^" regex {print $3 "\t" $9}'
    par contre j'ai un petit problème .. si c'est un dossier le grep m'affiche [CODE]grep: dir: est un dossier
    un petit problème avec TON script donc, c'est normal, la faute au $1* qui est évalué/"déplié" par bash et non par grep
    du coup ça revient à avoir une commande du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grep -F daga.c dev.sh dir/ doh.homer
    grep: dir/: Is a directory

  11. #11
    Membre habitué Avatar de silfun1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2015
    Messages : 117
    Points : 187
    Points
    187
    Par défaut
    Re,

    A mon tour de proposer quelque chose!
    Je trouves que la commande "ls -l|./script.sh <argument>" est un peu longue/curieuse, alors qu'on pourrait inclure le ls -l dans le script.
    un appel comme ./script.sh <argument> me semble plus joli.

    Voici donc ma proposition (qui est certe beaucoup plus longue)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #!/bin/bash
     
    #fonctions
    usage ()
    {
    	echo "Usage: $(basename $0) -d <chemin du dossier> -f <filter>"
    	echo ""
     
    	exit 1
    }
     
    #Variables
    VARfolder="."
    VARthefiltre=""
     
    #Vérification des arguments passées au script
    while getopts "hd:f:" opt
    do
    	case $opt in
    		h) usage ;;
    		d) VARfolder="$OPTARG";;
    		f) VARthefiltre="$OPTARG" ;;
    		*);;
    	esac
    done
     
     
    # Vérification de l'existance du dossier
    if [ -d "$VARfolder" ]; then
     
            #Si le dossier existe, alors on le parcours
            for folderitem in $VARfolder/*
            do
                    getgoodfile=""
                    if [ "$VARthefiltre" != "" ]; then
                                            #On écarte (ou pas) le nom du fichier, suivant le filtre récupéré en parametre
                            getgoodfile=$(echo $folderitem|grep $VARthefiltre)
                                            #Si le nom du fichier n'est pas vide, alors on l'affiche
                            if [ "$getgoodfile" != "" ]; then
                            						proprio=$(stat -c %U $getgoodfile)
                                                    echo $getgoodfile - $proprio
                            fi
                    else
                    		proprio=$(stat -c %U $folderitem)
                            echo $folderitem - $proprio
                    fi
     
            done
    else
            echo "Le dossier $VARfolder n'existe pas"
    fi


    L'informatique, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
    - Ne vous privez pas pour voter pour ma réponse si elle vous plaît bien
    - Ne pas hésiter à cliquer sur "Résolu" quand votre problème posé a trouvé une solution. Et un petit merci fait toujours plaisir

  12. #12
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par silfun1 Voir le message
    Je trouves que la commande "ls -l|./script.sh <argument>" est un peu longue/curieuse, alors qu'on pourrait inclure le ls -l dans le script.
    un appel comme ./script.sh <argument> me semble plus joli.
    et si ça fait partie des contraintes ?

    dans le cas contraire et comme dit plus haut le plus simple c'est de faire un combo find/stat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "test*" -exec stat --printf="%U\t%n\n" {} \;
    mais bon parce que tu t'es gavé sur ton script

  13. #13
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    Merci pour toutes vos réponse !
    ta solution marche nickel buffer

    juste une dernière chose: peut tu m'expliquer le role du ~ et du "^" ? je ne suis pas très bon en bash ..

  14. #14
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par awesomeman Voir le message
    peut tu m'expliquer le role du ~ et du "^" ? je ne suis pas très bon en bash ..
    ça tombe bien ce n'est pas du bash là c'est du awk

    • le tilde ~ spécifie qu'on cherche à matcher l'expression rationnelle à droite sur le champs à gauche (ici le champ n°9 donc)
    • l'accent circonflexe ^ fait partie de l'expression rationnelle en fait, c'est pour indiquer le début de la chaine, donc en clair, le début du champ 9 doit commencer par regex, la notation n'est pas courante, habituellement on aura une expression rationnelle qui ressemble plutôt à un truc comme /^test/, mais ici comme l'expression est dans une variable (regex) ça change un peu


    de la doc ?

  15. #15
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    Cool , un grand merci pour tes explications.
    je suis encore plus mauvais en awk
    tu dis que ce n'est pas du bash mais awk est un peu comme sed , il sert à manipuler du texte en bash, nan?
    awk est utilisé pour d'autres choses??
    j'adore le bash malheureusement je n'ai pas énormément de temps pour en faire ..
    c'est surtout la manipulation d'outils complexes comme sed et awk qui me manque . Au passage merci pour tes liens !

  16. #16
    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
    grep filtre un texte à partir d'une expression régulière ( = regular expression = regex)
    sed filtre et transforme un texte. Il ne peut pas faire d'arithmétique.
    awk filtre et transforme un texte. Il est particulièrement conseillé si ton fichier est organisé en champs (comme les fichiers csv). Il fait de l'arithmétique.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  17. #17
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par awesomeman Voir le message
    tu dis que ce n'est pas du bash mais awk est un peu comme sed , il sert à manipuler du texte en bash, nan?
    awk est utilisé pour d'autres choses??
    c'est un peu comme dire que comme ton ordi est dans ta maison et que ta maison fait partie du boulevard, alors ton ordi fait partie du boulevard

    bash sert à lancer des commandes, dedans on lance la commande awk (un programme donc) qui elle aussi prend des arguments, on peut pas dire que les arguments qui sont utilisés par awk sont aussi des argument pour bash

    awk n'a pas besoin de bash pour fonctionner, et pour parser du texte on est pas obligé d'utiliser uniquement awk ou sed, on peut aussi utiliser perl par exemple, la différence entre perl et awk c'est que perl prend plus de place en mémoire et permet de faire plus de choses en gros

    sinon bash a aussi de quoi parser du texte dans l'absolu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    read # on zappe la premiere ligne
    while read -a tab; do
      if [[ ${tab[8]} =~ ^$1 ]]; then
        echo -e "${tab[2]}\t${tab[8]}"
      fi
    done
    mais bon...

  18. #18
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    Ok, je vois.
    Mais ducoup awk et perl ne sont pas comparable, ce dernier est un vrai langage de prog alors que awk , est un programme , il n'a pas de réel "langage".

  19. #19
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par awesomeman Voir le message
    Mais ducoup awk et perl ne sont pas comparable, ce dernier est un vrai langage de prog alors que awk , est un programme , il n'a pas de réel "langage".
    awk est un langage à part entière

    dedans tu peux faire des if (...) {...} else {...}, des while (...) {...}, de l'arithmétique, il y a tout un set de fonctions prédéfinies comme printf(), length() ou asort(), tu peux même définir les tiennes, et à la fin remplacer ton #!/bin/bash par #!/usr/bin/awk -f et tout ça fonctionne magnifiquement, il est juste beaucoup moins fourni que Perl, donc forcément le binaire est plus léger

    pour la petite info, le 'k' de "awk" est pour l'un de ses trois inventeurs, Brian Kernighan

  20. #20
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    d'accord , je suis plutôt surpris , pour moi awk étais une commande au même titre que grep , cut ou autre (en même, j'utilise peu awk donc difficile de bien le connaitre..)
    En tout cas, merci pour toutes tes réponses, je me coucherai moins bête

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Toutes versions] MACRO pour insérer une valeur venant d'un fichier fermé (nom fichier variable)
    Par Seb-1 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/01/2015, 15h48
  2. Réponses: 1
    Dernier message: 18/11/2008, 21h42
  3. [CSV] Télécharger un fichier sur le serveur avec une URL
    Par bolandfranck dans le forum Langage
    Réponses: 2
    Dernier message: 23/06/2007, 13h33
  4. Réponses: 7
    Dernier message: 29/05/2007, 15h11
  5. Réponses: 3
    Dernier message: 05/05/2006, 18h36

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