it-swarm.com.de

Verwenden von OR Mustern in Shell-Platzhaltern

Inhalt meines Verzeichnisses sind

$ 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 Details von Dateien auflisten, deren Dateiname wie angegeben ein Word 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 gesagt, wie man Regex mit ls verwendet, damit ich OR die Dateinamen-Teile _.

Ursprüngliches Szenario, es gibt viele Dateien im Verzeichnis, haben den Fall für Fragen verkürzt.

58
mtk

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

ls {day*,night*}
73
itsbruce

In ls gibt es keine Option zum Filtern nach Dateinamen, aber in den meisten Shells gibt es eine Globbing-Erweiterung man 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 dieses Muster nicht erweitert wird, wenn einer der Fälle mit keiner Datei übereinstimmt (z. B. *day* night1.txt othernight.txt, Wenn kein Dateiname day; siehe man bash/EXPANSION oder /Brace Expansion speziell):

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

In allen Muscheln können Sie Folgendes tun:

ls -lrtd -- *day* *night*

Wenn in zsh entweder keine day oder night Datei vorhanden ist, schlagen die letzten beiden Befehle fehl. Setzen Sie die Option nonomatch oder csh_null_glob oder fügen Sie nach jedem Muster (N) hinzu, um dies zu vermeiden.

27

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

Sie können den erweiterten Mustervergleich durch aktivieren

$ shopt -s extglob

und dann

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

Siehe zum Beispiel das Bash Reference Manual (Pattern Matching)

14
Matteo