web-dev-qa-db-fra.com

Utilisation des commandes grep et ls -a

En utilisant ls –a et grep, comment listeriez-vous le nom de tous les fichiers de/usr en commençant par la lettre p ou la lettre r ou la lettre s en utilisant une seule commande grep? 

cela serait-il juste?

ls –a | grep [prs] /usr
6
Nicole Romain

Si vous essayez de trouver des fichiers, n'utilisez pas ls. Utilisez la commande find.

find /usr -name '[prs]*'

Si vous ne voulez pas chercher dans tout l'arbre sous/usr, procédez comme suit:

find /usr -maxdepth 1 -name '[prs]*'
4
Andy Lester
 ls -a /usr | grep '^[prs]'

Sélectionnerait dans la sortie de ls -a /usr (qui est la liste des fichiers dans /usr délimités par des caractères de nouvelle ligne) les lignes commençant par l'un des caractères p, r ou s.

C'est probablement ce à quoi s'attend votre enseignant, mais c'est faux ou du moins, il n'est pas fiable.

Les noms de fichier peuvent être constitués de plusieurs lignes car le caractère de nouvelle ligne est un caractère aussi valide que n'importe quel nom de fichier sous Linux ou tout unix. Donc, cette commande ne renvoie pas les fichiers dont le nom commence par p, q ou s, mais les lignes des noms de fichiers qui commencent par p, q ou s. Généralement, vous ne pouvez pas post-traiter de manière fiable la sortie de ls.

-a doit inclure les fichiers cachés, c’est-à-dire les fichiers dont le nom commence par .. Puisque vous ne voulez que ceux qui commencent par p, q ou s, c'est redondant.

Notez que:

ls /usr | grep ^[pqs]

serait encore plus faux. Le premier ^ est un caractère spécial dans quelques shells comme Bourne Shell, rc, es ou zsh -o extendedglob (bien que OK dans bash ou dans d'autres shells POSIX).

Ensuite, dans la plupart des shells (fish étant une exception notable), [pqs] est un opérateur de globbing. Cela signifie que ^[qps] doit être étendu par le shell à la liste des fichiers correspondant à ce modèle (par rapport au répertoire actuel).

Donc, dans les shells comme bash qui ne traitent pas ^ spécialement, s'il y a un fichier appelé ^p dans le répertoire courant, cela deviendra

ls /usr | grep ^p

S'il n'y a pas de fichier correspondant, dans csh, tcsh, zsh ou bash -O failglob, vous recevrez un message d'erreur et la commande sera annulée. Dans zsh -o extendedglob^ est un opérateur globbing, ^[pqs] signifierait tout fichier sauf p, q ou s.

4

Le commentaire de @twalberg convient parfaitement aux options que vous avez demandées. L'écho ignore les fichiers cachés, mais ceux-ci seront filtrés si vous ne voulez que les fichiers commençant par [prs].
Lorsque vous voulez des fichiers cachés pour d’autres filtres, une solution similaire serait ls -ad /usr/[prs]*, où l’option -d supprime la liste des sous-répertoires.
Cette solution affichera également le chemin complet, ce qui peut être supprimé lorsque vous accédez au répertoire en premier. Lorsque vous souhaitez rester dans votre répertoire actuel, utilisez un sous-shell. J'utilise && pour sauter le ls quand le répertoire/usr n'existe pas.

(cd /usr && ls -ad [prs]*)
2
Walter A

Je ls le répertoire et ensuite seulement appliquer la grep. En outre, il vous manque le caractère ^ pour filtrer uniquement les fichiers que start avec ces lettres:

$ ls -a /usr | grep ^[prs]
0
Mureinik

Pourquoi pas juste

 find /usr -type f -name '[prs]*'
0
Mithrandir