Excluindo um grande número de arquivos

0

Estou escrevendo um script para excluir um grande número de arquivos no linux. O script será executado a cada dois minutos no crontab. Eu tentei usar o   find /mnt/md0/capture/DCN/ -maxdepth 1 -type f -name "*.pcap" -print0 | xargs -0 ls -lt | tail -$del | awk '{print $8}'

e salvando isso em uma variável e tentou excluir usando o comando rm , mas dint run. Descobri que find . -type f -delete pode ser usado para excluir os arquivos, mas não sei como adicionar essa parte ao meu comando. Como eu faria isso?

    
por Jishnu U Nair 30.01.2014 / 16:25

2 respostas

3

#! /bin/zsh -
del=10
rm -f /mnt/md0/capture/DCN/*.pcap(D.Om[1,$del])

Usando os qualificadores zsh globbing:

  • D : inclui arquivos ocultos ( D ot files).
  • . : somente arquivos regulares (como find 's -type f )
  • Om : inverte O rder na idade (com base no m tempo de odificação)
  • [1,$del] : inclua apenas os primeiros arquivos $del .

Com ferramentas GNU:

cd /mnt/md0/capture/DCN/ &&
  find . -maxdepth 1 -name '*.pcap' -type f -printf '%T@@%p
cd /mnt/md0/capture/DCN/ &&
  find . -maxdepth 1 -name '*.pcap' -type f -printf '%T@@%p
#! /bin/zsh -
del=10
rm -f /mnt/md0/capture/DCN/*.pcap(D.Om[1,$del])
' | tr '
cd /mnt/md0/capture/DCN/ &&
  find . -maxdepth 1 -name '*.pcap' -type f -printf '%T@@%p
cd /mnt/md0/capture/DCN/ &&
  find . -maxdepth 1 -name '*.pcap' -type f -printf '%T@@%p%pre%' |
    tr '%pre%\n' '\n%pre%' | sort -n | head -n "$del" |
    cut -d@ -f2- | tr  '%pre%\n' '\n%pre%' | xargs -r0 rm -f
' | sort -zn | sed -z "s/[^@]*@//;$del q" | xargs -r0 rm -f
\n' '\n%pre%' | sort -n | head -n "$del" | cut -d@ -f2- | tr '%pre%\n' '\n%pre%' | xargs -r0 rm -f
' | sort -zn | sed -z "s/[^@]*@//;$del q" | xargs -r0 rm -f

find cria uma lista delimitada por NUL de nomes de arquivos com um registro de data e hora Unix prefixado (como 1390682991.0859627500@./file ) que é classificado por sort . sed remove o registro de data e hora e sai depois de ler $del registros. Isso é passado como argumentos para rm usando xargs -r0 .

ou:

%pre%

O mesmo, exceto que estamos usando cut para remover o registro de data e hora e head para selecionar as primeiras $del linhas. Como o cut e head do GNU não suportam -z para trabalhar em registros delimitados por NUL, usamos tr para trocar os caracteres Nline e NUL antes e depois de fornecer os dados para eles.

    
por 30.01.2014 / 16:32
0

Isso pode ser feito sem problemas no bash, combinando find -exec com um arquivo temporário. Infelizmente, isso requer a execução de pesquisa duas vezes - uma vez para contar os arquivos e, mais uma vez, remover todos os arquivos, exceto n . Observe que $FIND | wc -l não contará corretamente para nomes de arquivos, incluindo \n .

FIND="find /mnt/md0/capture/DCN/ -name "*.pcap" -type f -maxdepth 1"
$FIND | wc -l > delcount.tmp
$FIND -exec bash -c 'DELCOUNT=$(cat delcount.tmp) ; if [ $DELCOUNT -gt 5 ] ; then echo {}; echo $(( $DELCOUNT - 1 )) > delcount.tmp ; fi' ';'
rm delcount.tmp
    
por 30.01.2014 / 20:34

Tags