Verwenden von ODER-Mustern in Shell-Platzhaltern

52

Inhalt meines Verzeichnisses ist

$ 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

Ich möchte Einzelheiten zu Dateien auflisten, deren Dateiname ein Wort enthält.

Beispiel

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

Erwartete Ausgabe

-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

Wie man verschiedene Dateien auflistet, die mit 2 verschiedenen Parttern übereinstimmen, oder kurz, wie man Regex mit verwendet ls, damit ich ORdie Dateinamen teile.

Ursprüngliche Szenario, es gibt viele Dateien im Verzeichnis, haben den Fall zum Nachfragen verkürzt.

mtk
quelle

Antworten:

65

Sie müssen nicht einmal erweitertes Globbing aktivieren, um das zu tun, was Sie wollen. Dies funktioniert in bash:

ls {day*,night*}
itsbruce
quelle
7
Nein, das tut es nicht: touch day.txt; touch night.txt; ls {*day,night*}Ergebnisse inls: *day: No such file or directory
Matteo
1
Ich habe den Text des Originalposters angepasst. Ich dachte das wäre klar. Seufzer . Text aktualisiert. Sicher können Sie sehen, dass der Mechanismus funktioniert?
Itsbruce
7
Oder ist vielleicht *{day,night}*näher an dem, was der OP will.
Derobert
25

Es gibt keine Option lszum Filtern nach Dateinamen, aber in den meisten Shells gibt es Globbing-Erweiterungenman bash /Pattern Matching

ksh

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

zsh

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

oder:

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

Bash

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

In jeder dieser drei Shells können Sie dies tun, beachten Sie jedoch, dass, wenn einer der Fälle keiner Datei entspricht, dieses Muster nicht erweitert wird (z. B. *day* night1.txt othernight.txtwenn kein Dateiname enthalten ist day; siehe man bash /EXPANSIONoder /Brace Expansionspeziell):

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

In jeder Muschel können Sie Folgendes tun:

ls -lrtd -- *day* *night*

Wenn in zsh entweder no dayoder nightfile vorhanden ist, schlagen die letzten beiden Befehle fehl. setzt die nonomatchoder csh_null_globOption, oder fügen Sie (N)nach jedem Muster , dies zu vermeiden.

Nahuel Fouilleul
quelle
1
Was ist mit *{day,night}*. Ich würde es bearbeiten, aber ich weiß nicht, welche Shells es unterstützen?
Random832
@ Random832 Funktioniert in bash, kshund zsh(keine muss erweitert werden), aber nicht sh- Nahuels letztes Beispiel für "alle Shells" funktioniert jedoch in sh.
Izkata
14

Shells verwendet keine regulären Ausdrücke für die Argumenterweiterung.

Sie können den erweiterten Mustervergleich mit aktivieren

$ shopt -s extglob

und dann

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

Siehe zum Beispiel das Bash Reference Manual (Pattern Matching)

Matteo
quelle