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.

Antworten:


65

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

ls {day*,night*}

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.


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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.