Utilisation de modèles OR dans des caractères génériques de shell

52

Le contenu de mon répertoire est

$ ls -lrt
total 0
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 noon.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

Je voudrais énumérer les détails des fichiers qui ont un mot dans le nom du fichier tel que spécifié.

Exemple :

$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found

Production attendue

-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

Comment lister différents fichiers correspondant à 2 partenaires différents, ou en bref comment utiliser regex avec ls, de sorte que je puisse ORles parties du nom de fichier.

Les scènes originales, il y a beaucoup de fichiers dans le répertoire, ont raccourci le cas pour demander.

mtk
la source

Réponses:

65

Vous n'avez même pas besoin de disposer de fonctions étendues étendues pour faire ce que vous voulez. Cela fonctionnera à Bash:

ls {day*,night*}
itsbruce
la source
7
Non ça ne marche pas: les touch day.txt; touch night.txt; ls {*day,night*}résultatsls: *day: No such file or directory
Matteo
1
J'adaptais le texte de l'affiche originale; Je pensais que c'était clair. soupir . Texte mis à jour. Vous pouvez sûrement voir que le mécanisme fonctionne?
Itsbruce
7
Ou peut *{day,night}*- être plus proche de ce que le PO veut.
derobert
25

Il n'y a pas d'option lspour filtrer par nom de fichier, mais dans la plupart des shells, il y a une extension globbing.man bash /Pattern Matching

ksh

ls -lrtd -- *@(day|night)*

zsh

setopt extendedglob
ls -lrtd -- *(day|night)*

ou:

setopt kshglob
ls -lrtd -- *@(day|night)*

frapper

shopt -s extglob
ls -lrtd -- *@(day|night)*

Vous pouvez le faire dans n'importe lequel de ces trois shells, mais notez que si l'un des cas ne correspond à aucun fichier, ce modèle restera non développé (par exemple, *day* night1.txt othernight.txts'il n'y a pas de nom de fichier contenant day; voir man bash /EXPANSIONou /Brace Expansionspécifiquement):

ls -lrtd -- *{day,night}*

Dans n'importe quelle coquille, vous pouvez faire:

ls -lrtd -- *day* *night*

Dans zsh, s'il n'y a pas dayou nightfichier, les deux dernières commandes échoueront; définissez l' option nonomatchou csh_null_glob, ou ajoutez (N)après chaque motif pour éviter cela.

Nahuel Fouilleul
la source
1
Qu'en est- il *{day,night}*. Je l'éditerais, mais je ne sais pas quel shell le supporte?
Random832
@ Random832 Fonctionne dans bash, kshet zsh(aucun n'a besoin d'être étendu), mais pas sh- cependant, le dernier exemple de "tous les obus" de Nahuel fonctionne dans sh.
Izkata
14

Les shells n'utilisent pas d'expressions régulières pour développer les arguments.

Vous pouvez activer la correspondance étendue de motifs en

$ shopt -s extglob

puis

$ ls @(day|night).txt
day.txt   night.txt

Voir, par exemple, le manuel de référence Bash (Pattern Matching)

Matteo
la source