Como ordenar uma lista de arquivos por hora, considerando apenas os nomes dos arquivos

4

Dada uma lista de nomes de arquivos, como classificá-los pelo tempo de modificação dos arquivos?

A saída resultante precisa ser exatamente igual à entrada, com a exceção de que os dados foram classificados de acordo.

Aqui está uma amostra da entrada.

/jobs/crm/import/done/20140227-1359-0009.txt
/jobs/bridge/open-workitem/done/20140227-1359-0009.txt
/jobs/bridge/opened-workitem/done/20140227-1359-0009.txt
/jobs/bridge/update-workitem/done/20140227-1401-0001.txt
/jobs/bridge/update-workitem/done/20140227-1403-0001.txt
/jobs/tfs/import/done/20140227-1401-0001.txt
/jobs/tfs/import/done/20140227-1403-0001.txt
/jobs/tfs/open-workitem/done/20140227-1359-0009.txt
    
por Mario 27.02.2014 / 18:27

4 respostas

4

Assumindo que sua entrada é pequena, e os nomes dos arquivos não contêm espaços ou outros caracteres estranhos, você pode usar apenas ls .

ls -dt $(cat files)

$(cat files) coloca o conteúdo de files na linha de comando e os divide no espaço em branco para obter uma lista de argumentos. ls -t pega uma lista de arquivos como seus argumentos, classifica-os por mtime e os imprime. -d é necessário para listar os diretórios usando seu nome, em vez de seu conteúdo.

Se isso não for suficiente, você pode experimentar o padrão de decoração / classificação / undecorate , por exemplo

$ while IFS=$'\n' read file; do
    printf '%d %s\n' "$(stat -c +%Y "$file")" "$file"
  done <files | sort -k1nr | cut -f 2- -d ' ' >files.sorted

onde IFS=$'\n' read file; do ... done <files define file para cada entrada delimitada por nova linha em files , printf...stat... transforma <filename> em <mtime> <filename> , sort -k1nr classifica as linhas com base no primeiro campo em ordem numérica inversa , em seguida, cut remove o <mtime> , deixando você com apenas <filename> s na ordem classificada.

    
por 27.02.2014 / 21:32
2

Perl tem o operador '-M' para uma data de modificação do arquivo.

Este oneliner classifica os arquivos como necessário. A primeira linha do topo é o arquivo mais novo:

perl -e 'map { print "$_\n"; } sort { -M $a <=> -M $b } <*>'

ou com uma lista de arquivos

perl -e 'map { print "$_\n"; } sort { -M $a <=> -M $b } @ARGV' $(cat files)
    
por 27.02.2014 / 23:56
-1

Digamos que seu programa de terceiros seja chamado de producer.sh

então o seguinte comando irá ordenar a parte de datetime dos arquivos.

producer.sh | sed -e 's#/\([0-9].*$\)# #' |sort -i -k2|sed -e 's# #/#'

por ordem inversa

producer.sh | sed -e 's#/\([0-9].*$\)# #' |sort -r -i -k2|sed -e 's# #/#'

Com sua entrada, produz

$ cat flist1 |sed -e 's#/\([0-9].*$\)# #' |sort -i -k2|sed -e 's# #/#'
/jobs/bridge/opened-workitem/done/20140227-1359-0009.txt
/jobs/bridge/open-workitem/done/20140227-1359-0009.txt
/jobs/crm/import/done/20140227-1359-0009.txt
/jobs/tfs/open-workitem/done/20140227-1359-0009.txt
/jobs/bridge/update-workitem/done/20140227-1401-0001.txt
/jobs/tfs/import/done/20140227-1401-0001.txt
/jobs/bridge/update-workitem/done/20140227-1403-0001.txt
/jobs/tfs/import/done/20140227-1403-0001.txt
    
por 27.02.2014 / 21:01
-4

Supondo que seu fluxo de texto de entrada consiste em nomes de caminho completos de arquivos ou simplesmente arquivos no mesmo diretório em que você emite o comando, é possível usar o comando ls com alguns parâmetros para obter os arquivos de registro de data e hora mais recentes primeiro o comando ls onde (listoffiles é a entrada):

$ cat listoffiles | ls -lt

Para classificar os listoffiles por tamanho (quinta coluna de ls -lt output e maior tamanho primeiro) em vez de timestamp, o seguinte comando será suficiente:

$ cat listoffiles | ls -lt | sort -rn -k5

Nota1: Apenas deixe de fora o parâmetro -rn para obter o menor tamanho primeiro

Nota 2: Se os arquivos estiverem no mesmo diretório, você poderá eliminar o comando cat anterior nos dois exemplos acima.

Para separar todas as colunas dos nomes de caminho totalmente qualificados dos listofiles, eu pessoalmente usaria um comando nawk para imprimir a lista de coluna de arquivos na ordem mais recente do primeiro registro de data e hora da seguinte forma:

$ cat listoffiles | ls -lt | nawk '{print $9}'
    
por 27.02.2014 / 19:30