Como limitar o número de resultados Unix FIND

7

Existe uma maneira de limitar o número de resultados retornados pelo comando FIND em um sistema unix? Estamos tendo problemas de desempenho devido a um número excessivamente grande de arquivos em alguns diretórios.

Estou tentando fazer algo como:

find /some/log -type f -name *.log -exec rm {} ; | limit 5000
    
por lemotdit 22.02.2010 / 20:43

4 respostas

4

Parece que você está procurando por xargs , mas ainda não o conhece.

find /some/log/dir -type f -name "*.log" | xargs rm
    
por 22.02.2010 / 22:55
19

Você pode tentar algo como find [...] |head -[NUMBER] . Isso enviará um SIGPIPE para find quando head exibir suas muitas linhas, de forma que find não continue sua pesquisa.

    
por 22.02.2010 / 20:48
0
find /some/log -type f -name *.log -exec rm {} ; | limit 5000

Bem, o comando como citado não funcionará, é claro ( limit nem é um comando válido).

Mas se você executar algo semelhante ao comando find acima, provavelmente um problema clássico. Você provavelmente está tendo problemas de desempenho porque find executa rm uma vez para cada arquivo .

Você quer usar xargs , ele pode combinar vários arquivos em uma linha de comando, por isso invocará rm em um tempo limitado para muitos arquivos de uma só vez, o que é muito mais rápido.

    
por 22.02.2010 / 23:57
0

Apenas |head não funcionou para mim:

root@static2 [/home/dir]# find . -uid 501 -exec ls -l {} \; | head 2>/dev/null
total 620
-rw-r--r--  1 root   root           55 Sep  8 15:22 08E7384AE2.txt
drwxr-xr-x  3 lamav statlus 4096 Apr 22  2015 1701A_new_email
drwxr-xr-x  3 lamav statlus 4096 Apr 22  2015 1701B_new_email
drwxr-xr-x  3 lamav statlus 4096 May 11  2015 1701C_new_email
drwxr-xr-x  2 lamav statlus 4096 Sep 24 18:58 20150924_test
drwxr-xr-x  3 lamav statlus 4096 Jun  4  2013 23141_welcome_newsletter
drwxr-xr-x  3 lamav statlus 4096 Oct 31  2012 23861_welcome_email
drwxr-xr-x  3 lamav statlus 4096 Sep 19  2013 24176_welco
drwxr-xr-x  3 lamav statlus 4096 Jan 11  2013 24290_convel
find: 'ls' terminated by signal 13
find: 'ls' terminated by signal 13
find: 'ls' terminated by signal 13
find: 'ls' terminated by signal 13
find: 'ls' terminated by signal 13

(... etc ...)

Minha (definitivamente não é a melhor) solução:

find . -uid 501 -exec ls -l {} \; 2>/dev/null | head

A desvantagem é que o 'find' em si não é terminado após o número requerido de linhas, e executado em background até ^ C ou end, portanto as idéias são bem-vindas.

    
por 11.01.2016 / 22:12