• # exo7

    Posté par . En réponse au message aide commande linux. Évalué à 3.

    Allez, c'est vraiment parce que j'ai pas pu résister...

    1)
    La commande affiche chaque ligne contenant "floppy" parmi les lignes de tous les fichiers du répertoire /etc, mais avec une erreur...

    2)
    find parcourt le répertoire /etc et ses sous-répertoires à la recherche de fichiers classiques (c'est à dire ni répertoire, ni lien symbolique, ni fichier spécial...). Pour chacun de ces fichiers, il affiche le nom du fichier sur une ligne. Un extrait de la sortie du find peut alors ressembler à :

    /etc/passwd
    /etc/group
    /etc/fichier avec un espace
    /etc/fichier_sans_espace

    La sortie standard de la commande find est alors passée comme entrée standard à la commande xargs.
    Ensuite, xargs va lire son entrée standard comme une liste de noms, séparés par des espaces ou des sauts de ligne, et va appeler la commande grep pour chaque membre de la liste :

    grep floppy /etc/passwd
    grep floppy /etc/group
    grep floppy /etc/fichier
    grep floppy avec
    grep floppy un
    grep floppy espace
    grep floppy /etc/fichier_sans_espace

    Le nom qui contenait des espaces a été découpé sur plusieurs commande, ce qui va produire des messages d'erreurs (qui seront supprimés après, par le 2>/dev/null) et ne lancera pas la recherche dans le bon fichier. D'autres erreurs se produisent avec les noms de fichiers contenant des retours à la ligne, des apostrophes ou des guillemets, ou finissant par un backslash...

    Enfin, la dernière partie de la commande redirige les messages d'erreur dans le fichier spécial /dev/null, ce qui empèche leur affichage.

    Pour corriger le problème des fichiers dont le nom comporte des espaces ou d'autres caractères spéciaux, on peut faire:
    find /etc -type f -print0 | xargs --null grep floppy 2> /dev/null

    Les noms de fichiers sont alors séparés par des caractères "null" (code ascii 0) en sortie du find, et xargs ne tient compte que de ces caractères "null" comme séparateurs de la liste. Le problème est complètement résolu car le caractère "null" est interdit dans les noms de fichiers.