Como ordenar resultados de Localizar declaração por data?

5

Tentando encontrar arquivos que contenham strings específicas no nome, mas não sei como ordenar a saída, de um modo que eu só obtenho nomes de arquivos.

Eu tentei

OLDDATA='find . -regex ".*/[0-9.]+" | ls -t'

Mas o ls -t não está funcionando no resultado do find mas no diretório inteiro

edit: O resultado desta declaração deve ser classificado pelos diretórios do dia da modificação. Esse regex deve corresponder aos diretórios que contenham apenas números e pontos no nome.

    
por harcotlupus 12.11.2017 / 16:52

2 respostas

6

get file names only ... sorted by modification day

find + sort + abordagem cut :

find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort | cut -d' ' -f2
  • %T@ - Hora da última modificação do arquivo, em que @ é segundos desde Jan. 1, 1970, 00:00 GMT, com parte fracionária

  • %f - Nome do arquivo com qualquer diretório principal removido (somente o último elemento)

Para classificar em ordem decrescente:

find . -regex ".*/[0-9.]+" -printf "%T@ %f\n" | sort -k1,1r | cut -d' ' -f2
    
por 12.11.2017 / 17:41
5

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:

  1. 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 \[*? ).
  2. Algumas versões de ls podem manipular caracteres que não podem ser impressos na localidade atual.
  3. 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.

    
por 12.11.2017 / 17:39