Encontre os maiores arquivos de cada data em um diretório

4

Eu tenho um diretório semelhante ao seguinte:

-rw-r--r-- 1 root root 223K Apr 28 14:25 2015.04.28_14.25
-rw-r--r-- 1 root root 253K Apr 28 14:55 2015.04.28_14.55
-rw-r--r-- 1 root root 276K Apr 28 15:25 2015.04.28_15.25
-rw-r--r-- 1 root root 254K Apr 28 15:55 2015.04.28_15.55
-rw-r--r-- 1 root root 122K Apr 29 09:08 2015.04.29_09.08
-rw-r--r-- 1 root root 127K Apr 29 09:38 2015.04.29_09.38
-rw-r--r-- 1 root root  67K Apr 29 11:43 2015.04.29_11.43
-rw-r--r-- 1 root root 137K May 1 12:13 2015.04.29_12.13
-rw-r--r-- 1 root root 125K May 1  12:43 2015.04.29_12.43
-rw-r--r-- 1 root root 165K May 1 13:13 2015.04.29_13.13
-rw-r--r-- 1 root root 110K May 1 13:43 2015.04.29_13.43

Minha pergunta é: como eu encontraria o maior arquivo de cada data?

Por exemplo, o maior arquivo de 28 de abril, o maior de 29 de abril, 1º de maio, etc.

Informações do SO: Linux Kali 3.18.0-kali3-amd64 # 1 SMP Debian 3.18.6-1 ~ kali2 (2015-03-02) x86_64 GNU / Linux

    
por Proletariat 03.06.2015 / 16:28

3 respostas

5

No GNU / qualquer coisa,

ls -l --time-style=+%s \
| awk '{$6 = int($6/86400); print}' \
| sort -nk6,6 -nrk5,5 \
| sort -sunk6,6

Isso fará com que você fique com os limites UTC, adicione seu deslocamento de horário local ao calcário, conforme necessário, por exemplo, int (($ 6-7 * 3600) / 86400) para -0700 limites da meia-noite.

    
por 03.06.2015 / 18:27
2

Uma abordagem baseada em stat para obter as informações do arquivo e awk para determinar o máximo para cada data:

stat -c $'%.10y\t%s\t%n' * |
  awk 'BEGIN { FS=OFS="\t" }
       s[$1]<$2 { s[$1]=$2 ; n[$1]=$3 }
       END { for (d in n) print d,s[d],n[d] | "sort" }'

A saída será uma lista separada por Tab de tuplas (data, tamanho, nome do arquivo).

    
por 04.06.2015 / 07:45
0

Eu criaria um script em torno do uso de 'ls' para obter os arquivos em ordem de tamanho (e depois limitar o resultado para obter o maior.

Por exemplo, se você fizer 'ls -lS 2015.04.29 *', obterá uma lista dos arquivos em ordem de tamanho decrescente. Ou 'ls -lS 2015.04.29 * | head -1' deve dar-lhe o maior.

De lá, você pode remover apenas o nome do arquivo, etc., dependendo da sua necessidade (assim como percorrer todas as datas encontradas nos nomes dos arquivos para obter o maior para todas as datas, etc.). Essencialmente apenas um loop for baseado nas datas e os comandos ls para obter o maior para cada data.

    
por 03.06.2015 / 17:59