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


8

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

Embora eu possa localizar arquivos mais antigos com:

find . -mtime +10

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


adicione suas informações de distribuição e shell
lese

@lese: AIX 6.1; while echo $ SHELL -> / usr / bin / ksh
user148335

Isso soa como um problema XY ... você realmente precisa de TODOS os arquivos por ordem de tamanho? ou você (mais provavelmente) procura arquivos "antigos" (> 10 dias) grandes o suficiente e precisa, digamos, dos 200 maiores para decidir qual deles pode ser excluído para economizar espaço ?. Neste último caso, e como você está no AIX com talvez sem ferramentas gnu, uma combinação de find (saída de todos os arquivos> 10 dias) e awk (mantendo os 200 maiores arquivos maiores em uma matriz e, depois, em ordem) será sua melhor aposta
Olivier Dulac 10/11

Respostas:


8

Desde que os caminhos do 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 o findmanual , seção Actions.

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

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


1
Ele diz: find: 0652-017 -printf não é uma opção válida.
usar o seguinte comando

para mim isso funciona e parece uma solução bastante limpa +1
lese

@ user148335, você não mencionou a distribuição do Linux que está executando. Parece que você está limitado à especificação de localização do POSIX , que é bastante limitada.
Patryk.beza

1
@ patryk.beza Eu acho que você estava falando com user148335
lese

AIX 6.1; Enquanto echo $ SHELL -> / usr / bin / ksh
user148335

4

Este comando usa apenas os recursos POSIX de finde de ls:

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

No entanto, pode chamar lsmais de uma vez, se houver um número muito grande de arquivos no diretório atual (ou subdiretórios recursivamente) correspondendo ao -mtime +10primário.

Se ele chamar lsmais de uma vez, é claro, a classificação será feita apenas dentro de cada lsexecução, não entre várias execuções.

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


A versão atualizada não quebra com espaços no nome
Miguel G

1
Se lsestá sendo passado apenas um argumento, há pouca classificação que ele pode fazer. Com, em +vez de ;, isso seria melhor, mas lsainda pode acabar sendo chamado várias vezes se houver muitos arquivos.
Stéphane Chazelas

2
Esse é o comando exato que eu daria, então adicionei o texto explicativo que daria para acompanhá-lo.
Curinga

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 lssuporte -Ufor não classificado):

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

Adicione o Dqualificador glob se você deseja ver os arquivos ocultos também.


Isso funciona quando os nomes de usuários e grupos contêm espaços?
roaima

@roaima, sim. Por que não? Pode ser interrompido para o E2BIG, que você pode contornar usando zargs.
Stéphane Chazelas

Desde que você desde que, eu suspeitava que seria bom, mas eu precisava de pedir :-)
roaima

1

Eu acho que você poderia fazer algo semelhante a:

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

observe o -Sparâmetro de lscomando:

-S Classificar por tamanho do arquivo


Depois de soltar -d $ '\ 0' devido à mensagem: $ \ 0: este não é um identificador, eu consegui obter a saída, mas os arquivos não são gravados em ordem decrescente com base em seu tamanho
user148335

Quebrará quando você encontrar um diretório em /home/phphil. Tentels -ld ...
roaima 21/12/2015

@Roaima, que tal usar em find . -type fvez disso?
lese

@ lese Eu mudei o código, mas o comando parece lançar duas vezes cada arquivo de cada subpasta. Ex.
user148335

find ... -type ffuncionaria, assim como a adição da -dbandeira emls
roaima 21/12/2015

1

tente isto:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g

Com a opção -n, não é um problema por causa ls não lista usuário e groupname mas uid e gid vez
dervishe

0

Para um one-liner mais fácil você pode usar a findopção -ls. Aparece na maioria dos casos, o tamanho do arquivo está na sétima coluna das informações listadas (portanto, altere 7no final do comando, conforme apropriado, se não):

find . -type f -mtime +10 -ls | sort -n -r -k7

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 abreviar em ordem decrescente)

Aqui está o comando:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
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.