Usando padrões OR em curingas de shell

35

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 detalhes de arquivos que tenham 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 partterns diferentes ou, resumindo, como usar o regex com ls , para que eu possa OR das partes do nome do arquivo.

Scenarion original, há muitos arquivos no diretório, abreviou o caso para perguntar.

    
por mtk 08.10.2012 / 13:36

3 respostas

49

Você nem precisa de globbing estendido para fazer o que quiser. Isso funcionará no bash:

ls {day*,night*}
    
por 08.10.2012 / 17:24
17

Não há nenhuma opção em ls para filtrar o nome do arquivo, mas na maioria dos shells existem extensões de globbing man bash /Pattern Matching

ksh

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

zsh

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

ou:

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

bash

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 não expandido (por exemplo, *day* night1.txt othernight.txt se não houver nenhum nome de arquivo contendo day ; veja man bash /EXPANSION ou /Brace Expansion especificamente):

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

Em qualquer projétil, você pode fazer:

ls -lrtd -- *day* *night*

No zsh, se houver nenhum arquivo day ou night , os dois últimos comandos falharão; defina a opção nonomatch ou csh_null_glob ou adicione (N) após cada padrão para evitar isso.

    
por 08.10.2012 / 13:45
10

Shells não usam expressões regulares para expansão de argumentos.

Você pode ativar a correspondência estendida de padrões por

$ shopt -s extglob

e depois

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

Veja, por exemplo, o Manual de Referência do Bash (Correspondência de Padrões)

    
por 08.10.2012 / 13:45