it-swarm-eu.dev

Použití vzorů OR) v zástupných znakech Shell

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.

Příklad:

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

Očekávaný výstup

-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.

58
mtk

K tomu, co chcete, nepotřebujete ani rozšířené globování povoleno. To bude fungovat v bash:

ls {day*,night*}
73
itsbruce

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.

27
Nahuel Fouilleul

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)

14
Matteo