Utiliser les commandes grep et ls -a

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

est-ce que ce serait bien?

 ls –a | grep [prs] /usr 

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

 find /usr -name '[prs]*' 

Si vous ne souhaitez pas rechercher l’arbre entier sous / usr, procédez comme suit:

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

Sélectionnez 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 qui commencent par l’un des caractères p , r ou s .

C’est probablement ce que votre professeur attend, mais c’est faux ou du moins pas fiable.

Les noms de fichiers peuvent être composés de plusieurs lignes, car le caractère de nouvelle ligne est aussi valide qu’un caractère dans un nom de fichier sous Linux ou un unix. Cette commande ne renvoie donc pas les fichiers dont le nom commence par p , q ou s , mais les lignes des noms de fichiers commençant par p , q ou s . Généralement, vous ne pouvez pas post-traiter la sortie de ls manière fiable.

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

Notez que:

 ls /usr | grep ^[pqs] 

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

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

Donc, dans les shells comme bash qui ne traitent pas spécialement, s’il ya 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 obtiendrez un message d’erreur et la commande sera annulée. Dans zsh -o extendedglob^ est un opérateur de ^[pqs] , ^[pqs] signifierait n’importe quel fichier sauf p , q ou s .

Le commentaire de @twalberg est parfait pour les options que vous avez demandées. L’écho ignore les fichiers cachés, mais ceux-ci seront filtrés lorsque vous voulez uniquement des 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, cela peut être supprimé lorsque vous allez dans le répertoire en premier. Lorsque vous souhaitez restr dans votre répertoire actuel, utilisez un sous-shell correspondant. J’utilise && pour sauter le ls lorsque le répertoire / usr n’existe pas.

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

Je ls le répertoire et seulement ensuite appliquer le grep . De plus, vous manquez le caractère ^ pour filtrer uniquement les fichiers qui commencent par ces lettres:

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

Pourquoi pas juste

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