Encontre arquivos com mais de X dias e exiba-os pelo seu tamanho

8

Estou tentando obter os arquivos com mais de um número de dias e listá-los em ordem decrescente com base em seu tamanho com todas as informações (tamanho, caminho completo etc - algo semelhante fornecido por ls ).

Embora eu possa localizar arquivos mais antigos com:

find . -mtime +10

Não consigo listar as informações desejadas.

    
por user148335 21.12.2015 / 15:13

7 respostas

8

Desde que seus caminhos de arquivo não contenham caracteres de nova linha:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

Veja find manual , seção Actions .

  • %s Tamanho do arquivo em bytes.
  • %n Número de links físicos para arquivo.
  • %m Os bits de permissão do arquivo (em octal ).
  • %u Nome de usuário do arquivo, ou ID do usuário , se o usuário não tiver nome.
  • %g Nome do grupo do arquivo ou ID do grupo numérico, se o grupo não tiver nome.
  • %t A hora da última modificação do arquivo no formato retornado pela função C ctime .
  • %p nome do arquivo.
  • %l Objeto do link simbólico (string vazia se o arquivo não for um link simbólico).

BTW: observe que POSIX find manual não especifica a maioria das ações acima.

    
por 21.12.2015 / 15:25
3

com zsh :

ls -ldrS -- **/*(m+10)

Ou para evitar a classificação dupla (por nome por zsh e por tamanho por ls):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

ou (se o seu ls suporta -U para não classificado):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

Adicione o qualificador D glob se você quiser ver os arquivos ocultos também.

    
por 21.12.2015 / 15:46
3

Este comando usa apenas recursos POSIX de find e ls :

find . -type f -mtime +10 -exec ls -lS {} +

No entanto, pode chamar ls mais de uma vez, se houver um número muito grande de arquivos no diretório atual (ou subdiretórios recursivamente) que correspondam ao -mtime +10 primary.

Se ele chamar ls mais de uma vez, é claro, a classificação só será feita dentro de cada execução de ls , não em várias execuções.

Ainda assim, para um número razoável de arquivos, essa é provavelmente sua melhor aposta.

    
por 21.12.2015 / 15:48
1

Acho que você poderia fazer algo semelhante a:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'
find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'%pre%' line; do
    #echo "$line"
    ls -lS "$line"    
done
' line; do #echo "$line" ls -lS "$line" done

observe o parâmetro -S do comando ls :

-S sort by file size

    
por 21.12.2015 / 15:18
1

tente isso:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g
    
por 21.12.2015 / 15:37
0

Para uma linha mais simples, você pode usar a find option -ls . Aparece na maioria dos casos o tamanho do arquivo está na sétima coluna da informação listada (então altere 7 no final do comando conforme apropriado, se não):

find . -type f -mtime +10 -ls | sort -n -r -k7
    
por 22.12.2015 / 01:54
0

Outra variação seria usar:

  • find (para encontrar os arquivos correspondentes)
  • du (para mostrar o tamanho do arquivo em KB)
  • sort -n -r (para abreviação em ordem decrescente)

Aqui está o comando:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
    
por 10.11.2016 / 05:24

Tags