Linux: Comment lister tous les fichiers/répertoires en utilisant uniquement des ls
C'est une question donnée à l'université.
La question est: Liste tous les fichiers/répertoires à l'intérieur de testfiles
dossier, qui n'ont pas d'extension.
La réponse donnée est: est-ce
ls testfiles | grep -v "\."
Maintenant, juste pour comprendre comment ls
regex fonctionne, quelqu'un pourrait-il svp expliquer - moi comment ce serait en utilisant uniquement ls
? Par ailleurs, j'apprécierais un exemple qui utilise également le signe dollar $
, pour que le nom se termine par .[a-z]
.
Toute aide, vraiment apprécié.
Une chose de plus! Une autre réponse à cette question est à l'aide de:
ls testfiles | grep "^[^.]*$"
Comment est-ce que lire? J'ai lu ^[^.]*$
comme ceci:
^ -> does not contain
[^.] -> starts with a dot
* -> repeated zero or more times
$ -> till the end
Je voudrais quelqu'un pour me corriger sur ce...
Merci!
ls
.ls
utilise étendu glob syntaxe, pas de regex. Jetez un oeil à ceci pour des idées.[^.]
comme une expression régulière correspond à tout caractère unique sauf d'une période.Votre regex analyse n'est pas tout à fait à droite, un
^
au début est le début de l'ancre. De sorte que le motif est vraiment correspondant à un nombre de caractères qui ne sont pas un point du début à la fin.Vous avez perdu moi à "|". Si l'exigence est 'ls', alors qu'est-ce que grep faire là-dedans?
OriginalL'auteur m.spyratos | 2013-03-25
Vous devez vous connecter pour publier un commentaire.
Utilitaires Unix étaient destinés à être utilisés comme filtres, de sorte que la réponse donnée sens dans la mesure où il se rapproche d'une application réelle.
Vous faire comprendre, cependant, que
grep "\."
correspond le tout avec une "période" (d'où l'extension), etgrep -v "\."
correspond à tout le reste (c'est à dire, le complément).Il est difficile de rendre la commande plus précise de ce qu'il est déjà, car qui peut dire ce qui est destiné à être une extension, et ce qui ne l'est pas?
Partie 2:
ls testfiles | grep "^[^.]*$"
http://unixhelp.ed.ac.uk/CGI/man-cgi?grep
Donc
^[^.]*$
signifie en réalité:Tout ce qui commence et se termine avec une chaîne de caractères, chaque de ce qui n'est pas une période.
Le premier signe n'est pas une négation, cela signifie commence avec. Le deuxième signe est le "pas" du signifiant.
^[^.]*$
signifie en réalité: Tout ce qui commence et se termine avec n'importe quel caractère qui n'est pas une période." Non, il entend de tout ce qui a non seulement de la période de caractères à partir de début à la fin.Je voulais dire, tout ce qui commence et se termine avec une chaîne de caractères dont chacun n'est pas une période de... qui est un long moyen de dire ce que vous avez dit.
OriginalL'auteur ktm5124
Correction:
Ainsi, il ne doit avoir qu'une non point les choses du début à la fin.
OriginalL'auteur Charles Duffy
Vous pourriez le faire avec l'ignorer drapeau:
Note - fonctionne sur CentOS 6, vous ne savez pas sur les autres distributions Linux.
vous pouvez accepter ce que la bonne réponse 😉
Je pourrais oui! Mais au fond, j'étais à la recherche en comment convertir le
grep
enls
. Cela signifie que, en utilisant des expressions régulières.-I
fait le truc pour vous, mais ce n'est pas exactement ce que je cherchais. Je pense que borries591 réponse a été la meilleure: "ls utilise étendu glob syntaxe, et non pas l'expression rationnelle". Pourtant si, je vous remercie...Ce n'est pas tout à fait vrai --
ls
ne reconnaît pas, soit glob syntaxe ou regexes lui-même, sauf si vous utilisez des extensions telles que la-I
drapeau donnée ici. Le shell convertit globules dans une liste de fichiers avant qu'il ne démarre jamaisls
.OriginalL'auteur chue x
Depuis que vous avez marqués à la question de la bash, vous n'avez pas besoin de grep:
voir http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching
OriginalL'auteur glenn jackman