Listar arquivos maiores que {size} classificados por data


27

Quero resolver o problema 'liste os 10 arquivos mais recentes do diretório atual com mais de 20 MB'.

Com lseu posso fazer:

ls -Shal |head

para obter os 10 principais arquivos maiores e:

ls -halt |head

para obter os 10 arquivos mais recentes

Com o achado eu posso fazer:

find . -size +20M

Para listar todos os arquivos com mais de 20 MB no diretório atual (e subdiretórios, que eu não quero).

Existe alguma maneira de listar os dez principais arquivos mais recentes em um determinado tamanho, de preferência usando ls?

Respostas:


24

A opção 'diretório atual' para findé -maxdepth 1. Toda a linha de comando para suas necessidades é:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

ou

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head

8

Nota: Isso funcionará para o GNU-find, mas não para todos os outros.

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

Começando como @Rajish, mas usando o printfcomando from findpara especificar o formato de saída. Existem três formatos relacionados a tempo , atime, ctime e mtime - %Té para mtime %Ae %Csão para os outros formatos.

@é especificar o formato do tempo em segundos desde a época. %fé para o nome do arquivo, \npara uma nova linha entre 2 arquivos.

Em seguida, classificar por número na ordem inversa fornece primeiro os arquivos mais novos e levamos 20 linhas¹ head.

No final, sedé usado, para jogar fora as informações de tempo.

Since) como headfunciona linha por linha, um único arquivo com mais de 20 novas linhas no nome, que é um pouco incomum, mas não proibido, pode corromper a saída se pertencer às primeiras 20 correspondências. Se você tiver esses arquivos, tente se livrar deles - bem, para mudar o nome deles. Eles geralmente serão um problema para scripts simples.


11
Se você usar file's -lscomando, os caracteres especiais serão impressos como caracteres escapou-barra invertida: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Além disso, o formato será parecido com o ls -lEoghanM, também especificado de -lqualquer maneira.
manatwork

printfsó funciona para distribuições GNU específicas.
Brethlosze # 28/17

%T+gera data e hora legíveis pelo ser humano como 2018-11-06+13:37:54.4606466460o que também são classificáveis por sort(sem -n), ver: unix.stackexchange.com/questions/29899/...
Ciro Santilli新疆改造中心法轮功六四事件

5

Os qualificadores Glob do Zsh facilitam isso. O .qualificador seleciona apenas arquivos regulares, Lm+20seleciona arquivos com pelo menos 20 MB mais um byte; para incluir arquivos com exatamente 20 MB, use L+20971519. Em seguida, omclassifica diminuindo o tempo de modificação e [1,10]restringe a expansão às 10 primeiras correspondências. Você ainda precisa da -topção lsse deseja listar os arquivos por data; ou você pode passar os arquivos para algum outro comando (o mais jovem primeiro). Para passar os arquivos para outro comando com o arquivo mais antigo primeiro, use Ompara classificar aumentando o tempo de modificação e [-10,-1]extrair as últimas 10 correspondências.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

2

Eu acho que essa pode ser uma maneira melhor de resolver o problema ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

Para se livrar de qualquer erro ao encontrar tentativas de acessar arquivos que você não tem permissão para ler, você pode adicionar

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

1

Isso imprimirá apenas os 10 arquivos especificados, independentemente de quaisquer caracteres de nova linha incorporados nos nomes dos arquivos. Ele usa sistema de arquivosinodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done

-1

Obrigado por todas as respostas. O que eu busquei é o seguinte:

ls -halt | grep "M " |head

Embora renuncie aos 20 megabytes em favor de qualquer coisa acima de um megabyte (e abaixo de um gigabyte), é fácil lembrar e preservar o elemento legível humano do tamanho do arquivo.


4
Você não deve tentar analisar a saída de ls, ela mostra uma representação de arquivos, nada mais. Para nomes simples de arquivos, a saída é equivalente ao nome do arquivo, mas você não deve confiar nele.
Chris Baixo

É verdade, tenho certeza, mas em termos de usuário humano (e saída não sendo canalizada para outro lugar), é mais fácil lembrar esse, pois pode ser montado com mais facilidade a partir de ferramentas simples conhecidas tldp.org/LDP/GNU-Linux- Resumo das ferramentas / html / c1089.htm
EoghanM 25/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.