Pourquoi le glob `* *` renvoie-t-il des fichiers dont les noms contiennent `t`s?

Je n’ai vraiment aucune idée après avoir lu glob (programmation) des résultats imprimés en suivant la commande en shell, j’utilise (bash) comme mon shell. Compte tenu de cette hiérarchie de répertoires:

/sub2 s.py t2.txt nametoname.txt bees.txt /sub22 

 $ echo *[!t]* bees.txt nametname.txt s.py sub22 t2.txt 

Dans ma compréhension, les arguments de echo seront développés pour correspondre à tous les noms de fichiers qui ne contiennent pas la lettre t, mais le résultat est tout le contraire, pourquoi?

Cette commande affiche tous les noms de fichiers contenant la lettre t:

 $ echo *[t]* nametname.txt t2.txt 

Dans la commande précédente, j’ai simplement annulé [t] à [!t] , alors dans mon attente, il devrait faire le contraire de la deuxième commande.

Ce glob:

 echo *[!t]* 

Trouvera tout nom de fichier contenant au moins un caractère autre que celui-ci.

Donc, si vous avez des noms de fichiers comme t , tt , ttt alors ces noms de fichiers ne seront pas listés en utilisant ce glob.

Solution:

Si vous voulez lister les noms de fichiers sans lettre t vous pouvez utiliser cette commande find :

 find . -maxdepth 1 -mindepth 1 -not -name '*t*' 

Vous pouvez également append -type f pour répertorier les fichiers uniquement ou -type d pour répertorier les répertoires uniquement.

Comme d’autres réponses l’ont indiqué, *[!t]* renvoie les fichiers avec n’importe quel caractère autre que t .

Ce qu’ils n’ont pas encore fourni est une solution de rechange:

 shopt -s extglob ## enable extglobs echo !(*t*) ## list files with names not containing t 

Voir http://wiki.bash-hackers.org/syntax/pattern#extended_pattern_language

! est le caractère standard pour annuler une expression entre parenthèses. *[!t]* signifie correspondre à zéro ou plusieurs caractères arbitraires, suivis de tout sauf un t , suivi de zéro ou de plusieurs caractères arbitraires. En d’autres termes, faites correspondre tout nom de fichier contenant un caractère autre que t . Ce qu’il ne correspondra pas, ce sont des noms de fichiers composés uniquement de t s: t , tt , ttt , etc.

Si vous voulez seulement faire correspondre les noms de fichiers qui ne contiennent aucun t , voyez la réponse de Charles Duffy, car il m’a battu.