[Ubuntu-BR] Ajuda: Listando um intervalo no bash

C de-Avillez hggdh2 em ubuntu.com
Quinta Outubro 10 14:20:18 UTC 2019


On Mon, Oct 7, 2019 at 11:51 AM Flávio Barros <flaviobarros em gmail.com> wrote:
>
> Bom dia.
> Preciso listar alguns diretórios dentro de um intervalo. No caso abaixo,
> seria do dia 25 ao dia 30 do mês 09.
>
> 2019-09-25
> 2019-09-26
> 2019-09-27
> 2019-09-28
> 2019-09-29
> 2019-09-30
>
> Ao excutar ls 2019-09-[25-30]* , todos os diretórios são listados. O que
> está errado ?

Bem.

Em primeiro lugar, *não* é 'ls' que trabalha o asterisco no comando
'ls 2019-09-[25-30]*', mas *bash*. Por exemplo:

cerdea em piatam:~/tmp$ ls
2019-01-01/  2019-01-02/  2019-01-03/  2019-01-04/  2019-01-05/
2019-01-06/  2019-01-07/  2019-01-08/  2019-01-09/  2019-01-10/
# o default para o shell é "globbing", procurar por todas strings que
resolvem o padrão fornecido
# apenas para clareza, aqui eu guaranto que globbing está activo
cerdea em piatam:~/tmp$ set +f
cerdea em piatam:~/tmp$ ls 2019-01-[01-06]*
2019-01-01:
2019-01-02:
2019-01-03:
2019-01-04:
2019-01-05:
2019-01-06:
2019-01-07:
2019-01-08:
2019-01-09:
# agora, garantimos que o shell não irá expandir patterns (noglob)
cerdea em piatam:~/tmp$ set -f
cerdea em piatam:~/tmp$ ls 2019-01-[01-06]*
ls: cannot access '2019-01-[01-06]*': No such file or directory
2 cerdea em piatam:~/tmp$

O segundo ponto é que "[...]", para o bash, significa: nesta
*posição*, tente encontrar strings que resolvam
para cada *um* dos caracteres entre "[" e "]". O ponto-chave, aqui, é
UM caracter.

Então, o padrão "a[0134]b", por exemplo, pode ser resolvido pelas strings:
a0b
a1b
a3b
a4b

mas *não* por "a2b"! Ou por "a1bb", etc.

Se o padrão fornecido for (como o seu) "[25-30]"... isto corresponde
ao padrão expandido "[20]". O "-",
neste caso, corresponde à sequencia de caracteres, *em ordem
(ascendente)*, entre o caracter imediatamente antes do
"-" e o caracter imediatamente após o "-". Assim, "[0-5]" é
equivalente à "[012345]", "[a-ce-g]" é
"[abcefg]", e assim por diante. "5-3" é a sequência de caracteres
entre "5" e "3" -- o conjunto vazio...

A "ordem" imposta em caracteres depende do local ("locale", em Inglês).

Não sei se existe um manual de bash em Português. Para o em Inglês,
use 'man bash'. Leitura, como a
maioria dos manuais de *IX (UNIX, Linux, AIX, etc) é... difícil...

Cheers,
-- 
..hggdh..



Mais detalhes sobre a lista de discussão ubuntu-br