Como posso saber há quanto tempo um determinado arquivo está em um diretório?

3

Eu quero encontrar (e excluir) todos os arquivos de um diretório que esteja no diretório por mais de X dias. Eu sei que posso encontrar arquivos que não foram modificados em uma hora com find /directory/* -mmin 3600 , mas quando eu copio um arquivo antigo no Windows para meu diretório em um servidor Debian, ele mantém sua idade e eu não sei dizer por quanto tempo está lá.

    
por Jakub 24.09.2013 / 13:36

2 respostas

0

Tenha um script de shell.

#!/bin/sh

inotifywait --monitor --format="%e %f" --event=create,moved_from,moved_to,delete $directory |
while read event file
do
    case "$event" in
        # asterisks needed because directory events end in ",ISDIR"
        (CREATE*)
            echo "$(date +%s) $file" >>"$index"
            ;;
        (MOVED_TO*)
            # moved_to includes overwrites, so we have to grep out the file, to make sure it wasn't already there
            # use 'sponge' to enable safe reading and writing of the index in the same pipeline
            grep -Fv " $file" "$index" | sponge "$index"
            echo "$(date +%s) $file" >>"$index"
            ;;
        (MOVED_FROM*|DELETE*)
            grep -Fv " $file" "$index" | sponge "$index"
            ;;
    esac
done

Os acessos e modificações de arquivos são ignorados e não alteram o índice; no entanto, se você renomear um arquivo, seu registro de data e hora será atualizado.

Nunca há necessidade de sort do índice; nós só adicionamos novos arquivos ao final do índice e os removemos do meio.

inotifywait , conforme chamado no script, ouve eventos de arquivo e gera o tipo de evento, um espaço, o nome do arquivo ou diretório que causou o evento e uma nova linha. Você pode substituí-lo por um programa equivalente.

sponge simplesmente lê todas as entradas de stdin em um buffer interno e as grava em um arquivo. Você pode substituí-lo por um equivalente ou, alternativamente, gravar a saída para ${index}.new e, em seguida, mv -f "${index}.new" "$index" .

date +%s exibe a data e hora atuais como o número de segundos da Epoch. Essa invocação funciona com GNU e BSD date s. Você pode alterar o formato (por exemplo, date '+%F %T' ) para um índice legível ou substituir date por um equivalente.

    
por 26.09.2013 / 14:31
-1

Isso deve funcionar, por exemplo, 10 horas atrás:

X=10; find /directory/ -type f -atime $X -exec echo rm -fv {} ';'

-atime é "acessado pela última vez n * 24 horas atrás", remova "echo" se ele fizer o que você deseja.

também para arquivos modificados há uma hora, é mais simples:

find . -mtime 1
    
por 25.09.2013 / 20:57