web-dev-qa-db-fra.com

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

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 lister les détails des fichiers qui ont un mot dans le nom de fichier 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, afin que je puisse OR les parties du nom de fichier.

Scenarion original, il y a beaucoup de fichiers dans le répertoire, ont raccourci le cas pour demander.

58
mtk

Vous n'avez même pas besoin d'activer la globalisation étendue pour faire ce que vous voulez. Cela fonctionnera en bash:

ls {day*,night*}
73
itsbruce

Il n'y a pas d'option dans ls pour filtrer sur le nom de fichier mais dans la plupart des shells il y a l'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)*

bash

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

Dans n'importe lequel de ces trois shells, vous pouvez le faire, mais notez que si l'un des cas ne correspond à aucun fichier, ce modèle sera laissé non développé (par exemple *day* night1.txt othernight.txt s'il n'y a pas de nom de fichier contenant day; voir man bash/EXPANSION ou /Brace Expansion Plus précisément):

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

Dans toutes les coquilles, vous pouvez faire:

ls -lrtd -- *day* *night*

Dans zsh, s'il n'y a pas de fichier day ou night, les deux dernières commandes échoueront; définissez nonomatch ou csh_null_glob option, ou ajoutez (N) après chaque motif pour éviter cela.

27
Nahuel Fouilleul

Les shells n'utilisent pas d'expressions régulières pour l'expansion des arguments.

Vous pouvez activer la correspondance de modèle étendue en

$ shopt -s extglob

et alors

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

Voir par exemple le Bash Reference Manual (Pattern Matching)

14
Matteo