grep
não tem um operador ≤ per se ,
mas há uma maneira desajeitada de fingir. Você quer todas as datas entre o ano 0
(ou o ano 1; qualquer que seja o primeiro ano) até 20150414.
(Suponho que as datas do BC estão fora da mesa.)
Divida esse intervalo em sub-intervalos que podem ser correspondidos por expressões regulares:
- Ano 0 a 1999 - todos os anos começam com 0 ou 1, então grep para
[01]
.
(Todas as expressões regulares serão consideradas ancoradas
no início da linha, logo após o “3 _”.)
- Ano de 2000 a 2009 - regex
200
.
- Ano de 2010 até 2014 - regex
201[0-4]
.
- Ano de 2015, mês 1 até o mês 3 -
20150[1-3]
.
- Ano de 2015, mês 4, dia 1 a 9 -
2014040
- Ano de 2015, mês 4, dia 10 a 14 -
2014041[0-4]
e depois junte tudo:
grep -E '3_([01]|200|201[0-4]|20150[1-3]|2015040|2015041[0-4])'
ls -l
, é claro, fornece muitas informações sobre os arquivos
(modo, proprietário, tempo de modificação, etc.) que você não precisa,
então você usa awk '{print $NF}'
para retirá-lo e deixar apenas o nome do arquivo.
Isso é ineficiente e sujeito a erros
(quebra se um nome de arquivo tiver um espaço ou uma tabulação nele).
Analisar a saída de ls
nunca é uma ótima ideia,
mas você pode torná-lo um pouco mais seguro, tornando-o um pouco mais simples:
apenas não receba as informações que você não quer ou precisa,
e então você não precisa descartá-lo.
ls | grep -E '3_([01]|200|201[0-4]|20150[1-3]|2015040|2015041[0-4])'
deve ser bom o suficiente.
Mas construir essa expressão regular de seis partes é entediante e propenso a erros,
e difícil (embora não impossível) para roteiro. Aqui está uma maneira mais clara:
ls | awk 'substr($1, 3, 8) <= 20150414'
Isto extrai os oito caracteres começando com a 3ª posição
(ou seja, após o "3_") e compara-o com 20150414
como dois números de oito dígitos.