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.

user148335
fonte
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.

patryk.beza
fonte
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.

Miguel G
fonte
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.

Stéphane Chazelas
fonte
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

lese
fonte
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
dervishe
fonte
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
woodengod
fonte
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
Stephen Quan
fonte