Obsah mého ředitele je
$ 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
Chtěl bych vyjmenovat podrobnosti o souborech, které mají v názvu souboru slovo, jak je uvedeno.
$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found
-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
Jak vyjmenovat různé soubory odpovídající 2 různým partternům, nebo zkrátka jak používat regex s ls
, abych mohl OR
pojmenovat části.
Původní scénář, v adresáři je mnoho souborů, zkrátily důvod pro dotaz.
K tomu, co chcete, nepotřebujete ani rozšířené globování povoleno. To bude fungovat v bash:
ls {day*,night*}
V ls
není žádná možnost filtrovat název souboru, ale ve většině skořápek existují globbing rozšíření man bash
/Pattern Matching
ksh
ls -lrtd -- *@(day|night)*
zsh
setopt extendedglob
ls -lrtd -- *(day|night)*
nebo:
setopt kshglob
ls -lrtd -- *@(day|night)*
bash
shopt -s extglob
ls -lrtd -- *@(day|night)*
V kterémkoli z těchto tří skořápek to můžete udělat, ale uvědomte si, že pokud jeden z případů neodpovídá žádnému souboru, bude tento vzor ponechán nerozbalený (např. *day* night1.txt othernight.txt
pokud neexistuje název souboru obsahující day
; viz man bash
/EXPANSION
nebo /Brace Expansion
konkrétně):
ls -lrtd -- *{day,night}*
V jakékoli skořápce můžete:
ls -lrtd -- *day* *night*
Pokud zsh neexistuje žádný soubor day
nebo night
, poslední dva příkazy se nezdaří; nastavte nonomatch
nebo csh_null_glob
možnost, nebo přidat (N)
po každém vzoru, abyste tomu zabránili.
Shells nepoužívá regulární výrazy pro rozšíření argumentů.
Rozšířené přiřazování vzorů můžete povolit pomocí
$ shopt -s extglob
a pak
$ ls @(day|night).txt
day.txt night.txt
Viz například Referenční příručka Bash (Matching Pattern)