Usando padrões OR em caracteres curinga do shell

52

O conteúdo do meu diretório é

$ 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

Gostaria de listar os detalhes dos arquivos que têm uma palavra no nome do arquivo, conforme especificado.

Exemplo:

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

Saída esperada

-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

Como listar arquivos diferentes que correspondem a 2 partes diferentes ou, em suma, como usar regex com ls, para que eu pudesse ORas partes do nome do arquivo.

Cenário original, existem muitos arquivos no diretório, abreviaram o caso para perguntar.

mtk
fonte

Respostas:

65

Você nem precisa de globos estendidos ativados para fazer o que deseja. Isso funcionará no bash:

ls {day*,night*}
itsbruce
fonte
7
Não, não: touch day.txt; touch night.txt; ls {*day,night*}resultados emls: *day: No such file or directory
Matteo
11
Eu estava adaptando o texto do pôster original; Eu pensei que estava claro. suspiro . Texto atualizado. Certamente você pode ver que o mecanismo funciona?
itsbruce
7
Ou possivelmente *{day,night}*está mais perto do que o OP quer.
Derbert # 8/12
25

Não há opção lspara filtrar o nome do arquivo, mas na maioria das conchas existem extensões brilhantesman bash /Pattern Matching

ksh

ls -lrtd -- *@(day|night)*

zsh

setopt extendedglob
ls -lrtd -- *(day|night)*

ou:

setopt kshglob
ls -lrtd -- *@(day|night)*

bater

shopt -s extglob
ls -lrtd -- *@(day|night)*

Em qualquer um desses três shells, você pode fazer isso, mas observe que, se um dos casos não corresponder a nenhum arquivo, esse padrão será deixado sem expansão (por exemplo, *day* night1.txt othernight.txtse não houver um nome de arquivo contendo day; veja man bash /EXPANSIONou /Brace Expansionespecificamente):

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

De qualquer forma, você pode fazer:

ls -lrtd -- *day* *night*

Em zsh, se há ou não há dayou nightarquivo, os dois últimos comandos irá falhar; definir o nonomatchou csh_null_globopção, ou adicionar (N)após cada padrão para evitar isso.

Nahuel Fouilleul
fonte
11
Que tal *{day,night}*. Eu o editaria, mas não sei quais conchas o suportam?
usar o seguinte código
@ Random832 Obras em bash, kshe zsh(nenhuma necessidade estendida englobamento), mas não sh- no entanto, de Nahuel últimos "todas as conchas" exemplo funciona no sh.
Izkata 8/10/12