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 :

Commande "find" partiellement incomprise


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Points : 29
    Points
    29
    Par défaut Commande "find" partiellement incomprise
    Bonjour à tous,

    Je suis amené à faire un exercice dont voici l'intitulé :

    Use find to identify any file (not directory) modified in the last day, NOT owned by the root user and execute ls -l on them.

    En creusant j'ai trouvé la commande suivante qui permet de compléter l'exercice correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find / -mtime -1 -type f -uid +0 -exec ls -l {} \; 2>/dev/null
    Concernant les options employées, je n'ai pas de problème de compréhension, toutefois ce que je ne comprends pas ce sont les éléments qui succèdent l’exécution de la commande ls -l

    A savoir toute cette partie là : {} \; 2>/dev/null

    J'ai tenté d'orienter ma recherche sur les expression régulières, mais il semblerait que je fasse fausse route.
    Et la forme de la commande ne m'aide pas vraiment pour faire une recherche Google pertinente car je ne sais pas vraiment quels mots clefs employer..

    De ce que j'ai cru comprendre, 2>/dev/null redirige le flux stderr vers /dev/null mais je n'arrive pas à comprendre pourquoi (est-ce pour ne pas afficher d'erreur ?).

    Je vous remercie d'avance pour vos lumières, car là je sèche un peu ! : )

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bonjour

    find est une commande assez puissante car on peut lui indiquer, pour chaque fichier trouvé, de le faire traiter par une autre commande.
    Parlons maintenant de cette autre commande car c'est elle le pivot de la compréhension. Imagine que tu veuilles effacer de façon standard le fichier "toto", tu taperas naturellement rm -f toto. Imagine que tu veuilles copier toto dans /tmp, tu taperas cp toto /tmp.
    Comme tu le vois, tu as là deux syntaxes pas tout à fait équivalentes. Pour la première "rm" tu passes une option "-f" en premier paramètre, et le nom du fichier est passé en seconde position. Pour la seconde "cp", tu lui donnes le nom du fichier en premier paramètre, et tu donnes la destination "/tmp" en second.
    Ainsi toutes les commandes ne se valent pas dans leurs façon de considérer leurs arguments (et si tu connais la commande "tar" tu comprendras d'autant mieux ce que je veux dire)

    Maintenant, comment va faire "find" pour appeler ta commande tout en sachant comment positionner correctement le fichier qu'il trouve pour que la commande le comprenne correctement ? Grace à la syntaxe {}. Ces accolades symbolisent le fichier trouvé par find lorsqu'il doit appeler ladite commande et la lui passer.
    Ainsi imagine que je veuille supprimer tous les fichiers "toto", mon find sera écrit de cette façon: find / -name "toto" -type f -exec rm -f {} \;. Si maintenant je veux tous les copier dans "/tmp" (ok c'est con car le dernier écrasera les autres mais c'est pour l'exemple), mon find sera écrit find / -name "toto" -type f -exec cp {} /tmp \;.

    Et le point-virgule final est dans la même optique, pour indiquer à find que la commande se termine à telle position et que ce qui suit (ici 2>/dev/null) ne fait pas partie de la commande à invoquer mais continue le find. Et comme un point-virgule est un élément particulier du shell, il faut le protéger par un backslashe pour que find le récupère (sinon c'est le shell qui le récupère avant et find ne le reçoit pas).

    Et ce "2>/dev/null" permet de ne pas avoir de remontée de message d'erreur lorsque find se trouve dans l'impossibilité de descendre dans un répertoire (pas les droits suffisants par exemple)

    Il existe une autre syntaxe presque similaire: find / -name "toto" -type f -exec rm -f {} +. Ce "+" signifie "tous les fichiers trouvés d'un coup. Là où la première syntaxe avec le point-virgule appellerait 50 fois "rm" s'il y avait 50 fichiers trouvés, cette syntaxe ne l'appelle qu'une fois mais lui passe tous les fichiers trouvés en une grosse liste de paramètre (comme si tu tapais rm -f /x/toto /y/toto /z/toto pour effacer manuellement les 3 fichiers). Ce qui suppose alors évidemment que ladite commande n'attend rien d'autre que les fichiers à traiter dans cette liste d'arguments (impossible par exemple d'utiliser cette syntaxe pour copier dans /tmp car le dernier argument de "cp" n'est pas le fichier à copier mais sa destination).

    Donc ici find / -mtime -1 -type f -uid +0 -exec ls -l {} \; 2>/dev/null se lira
    • recherche à partir de la racine "/"
    • tout élément modifié il y a moins de 1 jour
    • de type f (fichier classique)
    • ayant un uid > 0 (donc pas uid root)
    • chaque fichier trouvé sera traité par la commande ls -l fichier_trouvé
    • tout en renvoyant les messages d'erreurs éventuels dans néant /dev/null

    PS: toutes les contraintes de recherche étant inclusives => il faut toutes les containtes validées pour que ça matche
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    [chipoterie]La vraie réponse à la question serait plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find / -mtime -1 -type f -not -user root -exec ls -l {} \; 2>/dev/null
    [/chipoterie]
    Cordialement.

  4. #4
    Nouveau membre du Club Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Bonjour Sve@r,

    Je te remercie beaucoup d'avoir pris de ton temps pour formuler cette réponse très précise, c'est beaucoup plus clair à présent !


    Pour ma culture générale, saurais-tu comment nommer les composants d'une commande, tels que "{}" ";" voire même "|" ?


    J'ai rencontré le même problème la première fois que je suis tombé sur une expression régulière.
    Ne sachant pas nommer le concept (regex), je ne savais pas comment formuler mes recherches en ligne pour trouver de la documentation les concernant.

  5. #5
    Nouveau membre du Club Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    [chipoterie]La vraie réponse à la question serait plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find / -mtime -1 -type f -not -user root -exec ls -l {} \; 2>/dev/null
    [/chipoterie]
    C'est souvent intéressant les chipoteries, mine de rien.

    Cela car l'UID de root peut être différent de "0" ?
    Je n'ai jamais rencontré le cas, mais cela m'intéresse de connaître le raisonnement derrière.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    D'un point de vue système, on regarde l'uid et le "0" est le super utilisateur mais en aucun cas "root" (qui n'est qu'un nom dans /etc/passwd).

    Mais passons, vois la question autrement et que l'on te demande de faire le find sur les fichiers de toto, tu penses qu'il aura toujours le même uid ?
    Cordialement.

  7. #7
    Nouveau membre du Club Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    D'un point de vue système, on regarde l'uid et le "0" est le super utilisateur mais en aucun cas "root" (qui n'est qu'un nom dans /etc/passwd).

    Mais passons, vois la question autrement et que l'on te demande de faire le find sur les fichiers de toto, tu penses qu'il aura toujours le même uid ?
    Non, effectivement c'est juste, dans ce cas de figure j'aurais eu tendance à utiliser -user toto.
    Je te remercie pour la précision.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    [chipoterie]La vraie réponse à la question serait plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find / -mtime -1 -type f -not -user root -exec ls -l {} \; 2>/dev/null
    [/chipoterie]
    Ah oui en effet, c'est plus parlant du point de vue humain (et la commande comprend la même chose)

    Citation Envoyé par novae84 Voir le message
    Cela car l'UID de root peut être différent de "0" ?
    Absolument pas. C'est "0" le référent, pas le nom "root". Un fichier possède un uid, si ce uid est 0 alors il appartient à root (même si le user littéral "root" est remplacé par autre chose dans les OS sécurisés). Le terme "root" exprime une notion tout autant qu'un user mais celui qui doit être "root" doit avoir un uid à 0, pas à autre chose.
    Et quand l'OS vérifie les droits, il commence par regarder si le uid qui accède à ce fichier est 0 et dans ce cas il arrête la vérif car il a tous les droits.

    Citation Envoyé par novae84 Voir le message
    Pour ma culture générale, saurais-tu comment nommer les composants d'une commande, tels que "{}" ";" voire même "|" ?
    "|" c'est un pipe, traduction américaine d'un tube de communication entre deux process (ls -l | sort | tr [':lower:]' '[:upper:]'). "{}" ça j'en sais absolument rien. Je ne suis même pas certain que ça ait un nom. Le man de find en parle sans donner de terme. On le retrouve aussi dans la commande "xargs" avec le même rôle (ie symboliser le fichier traité) là encore sans donner de nom. Mais ce n'est pas une regex. Dans les regex, le symbole "{}" représente la répétition (ex "a{1,}" signifiant "a répété de 1 à n fois")

    Citation Envoyé par disedorgue Voir le message
    Mais passons, vois la question autrement et que l'on te demande de faire le find sur les fichiers de toto, tu penses qu'il aura toujours le même uid ?
    [chipoterie]Ben en fait je pense que oui, pour plusieurs raisons
    • c'est mieux pour la cohérence du système, ou du travail de ses users, qu'un user ne change pas de uid tous les 4 matins (et à fortiori dans le cas d'un réseau de machines pour groupe de travail, vaut mieux que le user toto ait le même uid sur toutes les machines )
    • si tu demandes à chercher les fichiers de toto, et que toto a changé de uid, comment comprendre ta demande ? Chercher les fichiers de l'ancien uid ou du nouveau ? Ou des deux ? Et quoi faire si un nouvel user est arrivé entre temps en récupérant l'ancien uid de toto ?
    • si le besoin de changement de uid est réellement nécessaire (ok ça peut arriver) et que l'admin fait correctement son boulot, après avoir changé le user toto, il fera un find pour chercher tous les fichiers ayant l'ancien uid et pour les changer sur le nouveau (en faisant gaffe aussi aux liens symboliques car quand find rencontre un lien symbolique, sans précision particulière il va regarder le fichier lié et non le lien => on peut donc, si on ne fait pas gaffe, laisser les liens symboliques à l'ancien uid

    [/chipoterie]


    Citation Envoyé par novae84 Voir le message
    Non, effectivement c'est juste, dans ce cas de figure j'aurais eu tendance à utiliser -user toto.
    Une option sympa c'est "-nouser" permettant de retrouver les fichiers n'ayant plus de propriétaire (quand on supprime un user du système par exemple). Il y a son homologue pour les groupes avec "-nogroup".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Nouveau membre du Club Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Merci à toi pour ces précisions. : )

    Concernant le nommage des caractères spéciaux comme |, {}, etc.. je pense (sans certitude) que le terme que je recherchais est tout simplement "opérateurs".
    Mais j'ai un peu du mal à être formel à 100%, car je n'ai pas encore trouvé de liste ou doc. vraiment exhaustive de tous les caractères utilisables.

    edit : Mhh.. après réflexion, il ne servent pas tous à effectuer une opération, donc je doute quelque peu de ma déduction.. Peut-être que "caractères spéciaux" -tout bêtement- est plus approprié.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par novae84 Voir le message
    Mais j'ai un peu du mal à être formel à 100%, car je n'ai pas encore trouvé de liste ou doc. vraiment exhaustive de tous les caractères utilisables.
    Parce que certains caractères sont spécifiques au shell (pipe, dollar, point-virgule) tandis que d'autres sont spécifiques à une commande particulière, symbolique définie donc dans la commande par ses programmeurs. Donc déjà tu peux très bien avoir le même caractère pour deux commandes différentes avec deux significations différentes (exemple accolades n'ayant pas la même signification pour find et pour awk). Voire même qu'on retrouvera aussi le même symbole en shell tout en ayant une autre signification (les accolades en shell servent à manipuler/gérer le contenu d'une variable avant de retourner le résultat => echo ${HOME//\//:})

    Citation Envoyé par novae84 Voir le message
    Peut-être que "caractères spéciaux" -tout bêtement- est plus approprié.
    Non, eux ils ont déjà une définition: ce sont les caractères permettant de nommer partiellement un fichier => ls a??x*.c => lister tous les fichiers ayant un nom commençant par "a", ayant ensuite deux caractères quelconques mais présents puis un "x" puis ensuite toute chaine y compris une chaine vide et se terminant par ".c"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Nouveau membre du Club Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Je comprends, c'est limpide. Merci beaucoup pour ton aide !

  12. #12
    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
    Citation Envoyé par Sve@r Voir le message
    "{}" ça j'en sais absolument rien. Je ne suis même pas certain que ça ait un nom. Le man de find en parle sans donner de terme. On le retrouve aussi dans la commande "xargs" avec le même rôle (ie symboliser le fichier traité) là encore sans donner de nom.

    Mais ce n'est pas une regex. Dans les regex, le symbole "{}" représente la répétition (ex "a{1,}" signifiant "a répété de 1 à n fois")
    C'est vrai, le man find parle, sans la dénommer, de la string ``{}'', qui est remplacée par un (lorsque suivi de \;) ou plusieurs (lorsque suivi de \+) des pathnames trouvés par find.

    En tout cas, la string ``{}'' ne concerne que le cas où elle suit le paramètre -exec du find.

    Pour moi, c'est la représentation de l'argument variable utilisé par l'utilitaire invoqué par le -exec du find... si vous voyez ce que je veux dire...

    Ne dit-on par le RAVUPLUIPLEF habituellement ? ::

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    ...(lorsque suivi de \+)
    Pas besoin de backslash devant le "+", ce n'est pas un caractère spécial, le shell ne l'interprètera donc pas et find le recevra tel quel.
    Il faut bien comprendre que quand on écrit find ... -exec ... \;, le programme "find" lui il reçoit find ... -exec ... ; car c'est d'un point-virgule qu'il a besoin pour se repérer, pas d'un "backslash point-virgule". Le backslash sert juste à protéger le point-virgule, caractère spécial, pour pas qu'il soit bouffé par le shell lors de la prise en compte de la commande. On peut donc utiliser n'importe quelle technique pour protéger ce point-virgule afin qu'il soit transmis au find. Exemple: find / -type f -exec ls -l {} ';'.
    De même c'est aussi pour ça que quand on veut chercher un fichier en utilisant des wildcards (exemple l'étoile) qu'on doit protéger cette étoile du shell
    • find / -name "*.c"
    • find / -name '*.c'
    • find / -name \*.c

    Pour le "+" ça marche avec le backslash car quand un backslash ne sert à rien il est simplement shunté, mais ça marche donc aussi sans

    Citation Envoyé par jack-ft Voir le message
    En tout cas, la string ``{}'' ne concerne que le cas où elle suit le paramètre -exec du find.
    Je t'avouerai que je ne me suis jamais amusé à tenter de mette des accolades sans exec dans un find juste pour voir si ça le fait réagir
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    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
    Citation Envoyé par Sve@r Voir le message
    "{}" ça j'en sais absolument rien. Je ne suis même pas certain que ça ait un nom. Le man de find en parle sans donner de terme. On le retrouve aussi dans la commande "xargs" avec le même rôle (ie symboliser le fichier traité) là encore sans donner de nom.
    J'ai l'impression que l'usage de "{}" dans xargs a été instauré par ressemblance avec find, car on peut mettre n'importe quelle autre chaine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    \ls -t | xargs -I{} echo "{} -> {}" | head -2
    # donne la même chose que:
    \ls -t | xargs -Ifoo echo "foo -> foo" | head -2
    # ou
    \ls -t | xargs -Ifile echo "file -> file" | head -2
    # ou, même:
    \ls -t | xargs -Iecho echo "echo -> echo" | head -2
    L'intérêt d'utiliser "{}" réside également dans le fait que cette chaine a peu de chances d'apparaître par accident (sauf si on se fait un malin plaisir d'imbriquer un find à l'intérieur du xargs (mais faudrait vraiment être vicieux!)).

  15. #15
    Nouveau membre du Club Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Coucou !!

    Je suis confronté à une nouvelle interrogation, sur un exercice quasi similaire.
    Je préfère poster ici plutôt que d'ouvrir un nouveau topic afin de ne pas spammer le forum avec mes questionnements existentiels.
    N'hésitez pas à me dire si ce n'est pas approprié.

    En fait, l'intitulé de l'exercice est le suivant :

    Find files that have changed on your machine within the past 7 days by running a specific command in the background.

    Je suis donc assez rapidement parti sur cette commande :

    find / -mtime -7 -type f > FilesModif.txt; 2>/dev/null &
    Après exécution, mon fichier "FilesModif.txt" semble bien contenir tous les fichiers modifiés sur le système.

    Mais par contre, ce que je ne comprends pas, c'est pourquoi mon terminal est "occupé" avec l'affichage des erreurs.

    Comme cela :
    Nom : Screenshot from 2022-06-26 11-12-27.png
Affichages : 123
Taille : 556,1 Ko

    De prime abord, j'aurais cru que l'affichage des erreurs serait doublement "shunté", à la fois par le bout de commande 2>/dev/null qui envoie STDERR dans le Mordor, et par l'esperluette & qui exécute la commande en arrière plan.

    Du coup je me demande, pourquoi est-ce que les erreurs apparaissent ?

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par novae84 Voir le message
    Du coup je me demande, pourquoi est-ce que les erreurs apparaissent ?
    Le point-virgule. Il termine le find et la suite (2>...) n'est pas prise en compte dans la commande.
    C'est donc pour ça que si on veut passer un point-virgule au "-exec" on doit le protéger, afin qu'il ne soit pas pris en compte par le shell quand il est lu.
    N'oublie jamais qu'entre ton clavier et la commande invoquée, il y a le shell qui analyse et interprète le texte tapé.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #17
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 076
    Points : 4 392
    Points
    4 392
    Par défaut
    Citation Envoyé par novae84 Voir le message
    serait doublement "shunté", à la fois par le bout de commande 2>/dev/null qui envoie STDERR dans le Mordor, et par l'esperluette &
    pas compris ce que l'esperluette devait shunter...

    Après exécution, mon fichier "FilesModif.txt" semble bien contenir tous les fichiers modifiés sur le système.
    "semble" ! mais justement non !
    Si on a des erreurs c'est que nous n'avons pas tous les fichiers. Donc dans cette forme la commande ne répond pas exactement à la demande.
    note: Avec linux inclure des répertoires comme /usr/ et /tmp/ me parait sujet à réflexion/discussion
    $moi= ( !== ) ? : ;

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par novae84 Voir le message
    et par l'esperluette & qui exécute la commande en arrière plan.
    Citation Envoyé par papajoker Voir le message
    pas compris ce que l'esperluette devait shunter...
    D'accord avec papajoker (j'avais pas noté cette remarque). L'esperluette met la commande en arrière plan mais ne shunte absolument rien. Si la commande affiche des trucs, même en arrière plan les trucs seront quand-même affichés à l'écran.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Nouveau membre du Club Avatar de novae84
    Homme Profil pro
    Etudiant.
    Inscrit en
    Juin 2022
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Etudiant.

    Informations forums :
    Inscription : Juin 2022
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    D'accord avec papajoker (j'avais pas noté cette remarque). L'esperluette met la commande en arrière plan mais ne shunte absolument rien. Si la commande affiche des trucs, même en arrière plan les trucs seront quand-même affichés à l'écran.
    ---
    Le point-virgule. Il termine le find et la suite (2>...) n'est pas prise en compte dans la commande.
    Oui effectivement, c'est une mauvaise formulation de ma part, désolé.
    Ce que je voulais dire, c'est que je pensais que la mise en arrière plan de la commande, aurait fait que les erreurs soient traitées comme le reste de la commande et ne soient pas affichées dans le terminal.
    (ce qui aurait été sale tout de même, je n'ai pas vraiment d’intérêt à faire cela je pense .)
    Mais je comprends mieux avec ta précision concernant le ;.



    Citation Envoyé par papajoker Voir le message
    pas compris ce que l'esperluette devait shunter...
    "semble" ! mais justement non !
    Si on a des erreurs c'est que nous n'avons pas tous les fichiers. Donc dans cette forme la commande ne répond pas exactement à la demande.
    note: Avec linux inclure des répertoires comme /usr/ et /tmp/ me parait sujet à réflexion/discussion
    Effectivement .. !
    Concernant la pertinence d'inclure ces répertoires, je suppose que c'est un peu la joie des exercices théoriques.

    J'ai essayé de refaire la commande, mais sur une VM avec moins de processus en arrière plan, en tant que root et sans rediriger STDERR.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    root@vm# find / -mtime -7 -type f > FilesModif.txt 
     
    find: '/proc/2931/task/2931/fdinfo/5': No such file or directory
    find: '/proc/2931/fdinfo/6': No such file or directory
    find: '/run/user/130/gvfs': Permission denied
    J'ai bien moins d'erreurs.
    Mais je ne m'explique pas pourquoi "Permission denied" (je suis root, comment le système ose-t-il s'adresser à moi ainsi ?!)
    Je suppose que c'est dû au fait que le fichier soit un processus en cours d'utilisation (?)

    Quant à "No such file or directory" je ne comprends pas du tout pourquoi le système me remonte cette information.

  20. #20
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 076
    Points : 4 392
    Points
    4 392
    Par défaut
    Citation Envoyé par novae84 Voir le message
    Je suppose que c'est dû au fait que le fichier soit un processus en cours d'utilisation (?)
    Je suppose plutot que les process sont morts lors de ta commande find.
    Pour le dernier, c'est normal avec fuse, uniquement l'utilisateur 130 à accès
    $moi= ( !== ) ? : ;

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

Discussions similaires

  1. [XL-2010] Commande VBA Find
    Par DAmiot1949 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/12/2013, 17h16
  2. Commande equivalent find sous windows powershell
    Par laoho dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 02/03/2012, 10h53
  3. commandes ls, find, grep
    Par toto753 dans le forum AIX
    Réponses: 3
    Dernier message: 03/06/2011, 16h15
  4. [FTP API org.apache.commons.net.ftp] Commande 'Quote'
    Par JnJp28 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 30/11/2007, 13h23

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