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.