Como encontro pastas que não contêm arquivos modificados recentemente?

2

Eu tenho um diretório que obtém muitos dados despejados nele e quero encontrar todos os diretórios cujo conteúdo não tenha sido modificado recentemente (por exemplo, nos últimos cinco dias). Eu estou tentando compor uma chamada para find que faz o que eu estou procurando, mas estou começando a me perguntar se isso é mais complexo do que o que o Find pode manipular. Aqui está o que eu tentei, que não está fazendo exatamente o que eu espero:

find "$DUMP_DIR" -type d -d 2 \
    -execdir bash -c 'find . -mtime -5 >/dev/null 2>&1' \; \
    -prune

A estrutura do diretório é apresentada como $DUMP_DIR/category{1,2,3,4,5}/thing* mais ou menos. Eu quero saber o que thing* diretórios tiveram novos dados despejados em algum lugar dentro deles recentemente. A solução ingênua find "$DUMP_DIR" -type d -d 2 -mtime +5 irá corresponder mais do que eu quero.

Eu esperava que a expressão -execdir descobrisse se algum diretório contém algo modificado nos últimos cinco dias (retornando diferente de zero se nada for encontrado), mas acho que não é bem assim.

Eu estou preso com o BSD encontrar instalado no OS X. Eu também prefiro não instalar nada que não faça parte dos utilitários de linha de comando padrão. Qual é a maneira mais razoável de fazer isso?

    
por user108471 24.02.2015 / 19:01

2 respostas

1

Eu acredito que isso vai fazer o que você precisa. Ele verifica cada diretório por vez e verifica se não há arquivos "modificados recentemente".

find * -type d |
    while read DIR
    do
        LINES=$(find "$DIR" -maxdepth 1 -type f -mtime -5 -print -quit)
        test -z "$LINES" && echo "$DIR NOT RECENTLY MODIFIED"
    done

Se o find ... -maxdepth 1 não funcionar para sua situação, sinta-se à vontade para alterá-lo para algo assim

LINES=$(find "$DIR" \( -type d -prune \) -o \( -type f -mtime -5 -print -quit \))

E se você quiser contar o número de itens modificados recentemente (ou se -quit não estiver disponível), isso funcionará

LINES=$(find "$DIR" -maxdepth 1 -type f -mtime -5 | wc -l | tr -d' ')
test 0 -eq "$LINES" && echo "$DIR NOT RECENTLY MODIFIED" || echo "$DIR has $LINES recent file(s)"
    
por 24.02.2015 / 19:28
1

Se eu entendi corretamente a pergunta, isso pode ser feito simplesmente com

find . -mtime +5 -exec bash -c 'echo "${0%/*}"' {} \; | sort | uniq
    
por 24.02.2015 / 19:35

Tags