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 OR
die Dateinamen teile.
Ursprüngliche Szenario, es gibt viele Dateien im Verzeichnis, haben den Fall zum Nachfragen verkürzt.
touch day.txt; touch night.txt; ls {*day,night*}
Ergebnisse inls: *day: No such file or directory
*{day,night}*
näher an dem, was der OP will.Es gibt keine Option
ls
zum Filtern nach Dateinamen, aber in den meisten Shells gibt es Globbing-Erweiterungenman bash
/Pattern Matching
ksh
zsh
oder:
Bash
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.txt
wenn kein Dateiname enthalten istday
; sieheman bash
/EXPANSION
oder/Brace Expansion
speziell):In jeder Muschel können Sie Folgendes tun:
Wenn in zsh entweder no
day
odernight
file vorhanden ist, schlagen die letzten beiden Befehle fehl. setzt dienonomatch
odercsh_null_glob
Option, oder fügen Sie(N)
nach jedem Muster , dies zu vermeiden.quelle
*{day,night}*
. Ich würde es bearbeiten, aber ich weiß nicht, welche Shells es unterstützen?bash
,ksh
undzsh
(keine muss erweitert werden), aber nichtsh
- Nahuels letztes Beispiel für "alle Shells" funktioniert jedoch insh
.Shells verwendet keine regulären Ausdrücke für die Argumenterweiterung.
Sie können den erweiterten Mustervergleich mit aktivieren
und dann
Siehe zum Beispiel das Bash Reference Manual (Pattern Matching)
quelle