Você nem precisa de globbing estendido para fazer o que quiser. Isso funcionará no bash:
ls {day*,night*}
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.
$ 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
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.
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.
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)