Seu método pode ser adaptado para funcionar em casos simples. O principal problema que você está enfrentando é que você está passando entrada para ls , mas ls não recebe nenhuma entrada. ls aceita argumentos da linha de comando. Então você precisa passar a saída de find como argumentos para ls , com uma substituição de comando. Além disso, caso um diretório seja correspondido, passe -d para ls para listar o diretório em si e não seu conteúdo.
OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))
Apenas em casos simples, porque existem duas restrições:
- Isso depende de um substituição de comandos sem aspas (e também o uso de
$OLDDATA depois). Portanto, pressupõe-se que os nomes dos arquivos não contenham nenhum caractere especial (espaços em branco ou caracteres curinga \[*? ).
- Algumas versões de
ls podem manipular caracteres que não podem ser impressos na localidade atual.
- Se o comprimento total dos nomes dos arquivos for muito longo, você receberá um erro. (Observe que
find … -exec e xargs não podem ajudar aqui, pois ls deve ser executado uma única vez para obter a ordem correta dos nomes de arquivos. Tudo o que eles podem fazer é ocultar erros e produzir saída que não esteja corretamente classificada - e mangle mais alguns caracteres, no caso de xargs .)
Uma maneira simples e robusta de fazer isso é usar zsh . Ele tem a capacidade de classificar correspondências com curingas, graças aos qualificadores .
setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
- Como isso não chama nenhum outro programa, não há limite de tamanho além da memória disponível e nenhum risco de manuseio do nome do arquivo em nenhum ponto.
- O resultado é uma lista de strings (cada string sendo um nome de arquivo), não uma string, então ela entra em uma variável de array.
-
**/ atravessa subdiretórios recursivamente, evitando o uso de find .
-
## significa “um ou mais dos precedentes” na sintaxe zsh extended glob, é análogo a + na sintaxe regex (estendida).
-
(om) é um qualificador glob para classificar arquivos por hora de modificação, como ls -t .
Não é notoriamente uma maneira simples de fazer isso de forma robusta com ferramentas POSIX ou mesmo com ferramentas GNU e ksh.