Lista de pastas de nível superior com conteúdo não inferior a 30 dias

3

Eu tenho um sistema automatizado para criar contas FTP (vsftpd com usuários virtuais presos) que funciona bem, mas ainda confio na limpeza manual de contas antigas.

Minha definição de uma conta obsoleta é aquela em que não existem arquivos ou pastas com menos de 30 dias.

Até agora, posso executar isso:

find /home/vsftpd -ctime +30 |awk -F'/' '{print $4}' |sort -u 

O que me dará uma lista de pastas contendo pelo menos um arquivo com mais de 30 dias. Eu também poderia correr com -ctime -30 e, com algum looping pesado, negar essa lista para obter as informações que eu preciso.

Espero que haja uma maneira de fazer isso como um one-liner (moderadamente sensato), mas meu find-foo me falha neste momento. Alguém pode ajudar?

    
por SmallClanger 18.09.2012 / 15:35

2 respostas

2

Eu faria (com o GNU find) algo como:

cd /home/vsftpd &&
for i in */; do
  if ! find "./$i" -ctime -30 -print -quit | grep -q .
    echo no file touched in the past 30 days in "$i"
  fi
done

(assumindo que as contas estão um nível abaixo / home / vsftpd)

Com zsh:

stale() (: $REPLY/**/*(NDm-30e:'exit 1':))
cd /home/vsftpd &&
  echo those are stale: *(/+stale)
    
por 18.09.2012 / 16:03
1

Se você quer um one-liner para isso, use zsh. É um pouco enigmático, como a maioria dos usos avançados de qualificadores glob .

echo *(/e\''set -- $REPLY/**/*(Nm-30[1]); ((!$#))'\')

O outer glob corresponde apenas aos diretórios ( / ) de forma que a expressão ( e ) dentro do singlequotes seja verdadeira. A expressão usa o diretório correspondente ( $REPLY ) e procura abaixo dela ( **/ ) para arquivos modificados nos últimos 30 dias ( m-30 ), sem causar um erro se nenhum arquivo corresponder ( N ) e somente mantendo a primeira correspondência ( [1] ). A expressão é verdadeira se não houver correspondência.

Outro método é listar os diretórios com arquivos recentes, depois tomar o complemento da lista.

comm -13 <(find . -mtime -30 | sed -e '/^\.$/ d' -e 's~^\./~~' -e 's~/.*~~' | sort -u) \
         <(find . -type d -name . -o -prune -print | sed -e 's~^\./~~')
    
por 19.09.2012 / 03:07

Tags