Question (Ubuntu / Linux) La commande "find" donne des résultats différents en fonction des guillemets


J'utilisais

find -iname *prib*

et obtenir un seul résultat "./prib09jack.pdf" avec

find -iname "*prib*" 

Je reçois beaucoup plus de résultats que je cherchais tels que

./Dir1/PRIB09/prib09jackTFF1.pdf

et bien d'autres, mais pourquoi les guillemets étaient-ils présents?prib"?

Meilleur.


4
2017-08-26 16:13


origine


Avez-vous lancé la commande à partir du même répertoire et obtenu des réponses différentes? Quelle était toute la structure de commande de recherche que vous avez utilisée car il existe de nombreuses options qui affectent le résultat. - dtlussier
J'étais dans le même répertoire pour chaque utilisation en ne modifiant que les guillemets autour de la chaîne de recherche. - Vass


Réponses:


S'il y a un fichier (ou des fichiers) correspondant *prib* dans le répertoire en cours lorsque la commande find est exécutée, le shell développe le caractère générique pour correspondre au (x) nom (s) de fichier avant de transférer les arguments à trouver, et entraîner l'exécution d'une commande différente de celle attendue par l'utilisateur.

Par exemple,

$ ls foo*
foobar

$ find -iname foo*
./foobar

$ find -iname "foo*"
./foobar
./dir/foobz
./dir2/fooblat

En bref, Quotes retarde l'interprétation des caractères génériques pour la commande find à effectuer. Le manque de devis se développe immédiatement.


10
2017-08-26 16:42



wow, c'était profond. Je ne peux pas dire que je l'ai complètement compris. Alors, devrais-je toujours utiliser les citations dans des situations similaires? Ce que vous avez dit sonnait comme si elle rencontrait une chaîne correspondant à une forme du caractère générique, des recherches supplémentaires suivraient cette extension générique initiale. Et que les citations empêchent cela de se produire. (Si je ne me trompe pas, la page de manuel ne dit rien pour éviter une telle erreur). - Vass
Vous avez trouvé cela expliqué dans le bash page de manuel, pas le find page de manuel, car les guillemets sont gérés par le shell. Fondamentalement (pour répéter ce que dit kmarsh), si vous utilisez *prib* sans guillemets, bash recherche les fichiers dans le répertoire en cours avec des noms correspondant à ce modèle et remplace *prib* avec les noms des fichiers avant d'appeler find. Si vous utilisez des guillemets, bash laisse le *prib* seul. - David Z
@Vass: Vous pouvez utiliser echo *prib* et de voir ce que bash fait aux arguments avant de les transmettre à la commande. echo lui-même imprime simplement les arguments inchangés, de sorte que sa sortie vous indique à quoi *prib*. - sth
@ sth zaw. Merci beaucoup. c'était l'ouverture des yeux. Merci beaucoup d'avoir pris la peine de me le dire. C'est comme s'il y avait une toute autre dimension à la ligne de commande que je ne connaissais pas. - Vass
@David, merci pour l’élaboration, et @Vass, heureux de vous aider et merci pour la réponse acceptée. @sur bon point, j'utilise aussi echo quand je veux voir ce qui va arriver à l'expansion des caractères génériques. - kmarsh


Le problème est que votre shell étend les caractères génériques avant de les trouver. Vous voulez trouver pour les obtenir, alors vous devez leur échapper. Les citations font cela, ou vous pourriez faire

find -iname \*iprib\*

et ça marcherait aussi. L'essentiel est que vous souhaitiez que les caractères génériques le rendent non interprété par quelque chose d'autre (comme votre shell).


1
2017-08-26 20:18