Lista todos os diretórios cujos conteúdos (arquivos) não foram atualizados ou acessados antes de uma determinada data?

0

Gostaria de localizar pastas facilmente para arquivar / lixeira e uma maneira fácil de automatizar isso seria escolher pastas que eu não fazia uso há anos. Como as próprias pastas podem ter datas de modificação diferentes dos arquivos que contêm, estou pensando se já existe um comando * nix que faz isso para mim.

Caso contrário, suponho que eu possa escrever um script que primeiro localize diretórios que não tenham sido atualizados ou acessados antes de uma determinada data e, em seguida, percorra recursivamente seus conteúdos para garantir que eles também não tenham sido acessados ou modificados desde essa data. .

Mas se uma ferramenta como esta já existir, prefiro não reinventar a roda.

    
por Jordan Reiter 20.08.2015 / 16:36

2 respostas

1

find /some/where -type d \( -atime +1234 -o -mtime +1234 \) -print | ...
    
por 20.08.2015 / 16:55
1

O tempo de acesso em um diretório raramente é útil. Na primeira vez que você executar ls ou find no diretório, seu tempo de acesso será atualizado.

Você pode simplesmente procurar por arquivos que não foram acessados há muito tempo:

find . -type f -atime +999 -print

Se você estiver interessado apenas em diretórios em que nenhum dos arquivos foi acessado por um longo tempo, é possível combinar um comando find para explorar diretórios e um comando find para explorar arquivos em um diretório.

find . -type d -exec sh -c '
    recent=$(find "$0" -mindepth 1 -maxdepth 1 ! -type f -atime +999 -print | head -n 1)
    if [ -z "$recent" ]; then printf %s\n "$0"; fi
  ' {} +

Observe que esse snippet pode imprimir um diretório em que nenhum dos arquivos regulares foi acessado recentemente, mas há arquivos que foram acessados recentemente. Ignorá-los não é fácil com find sozinho, a menos que você apenas remova -maxdepth 1 para percorrer os diretórios independentemente, o que acionaria muita atividade repetida no disco. Aqui está um script bash não testado que faz o diretório andar manualmente, mantendo o controle de quais diretórios contêm apenas arquivos que não foram acessados recentemente.

#!/bin/bash
shopt -s dotglob
explore () {
  local entry keep=
  for entry in "$1/"*; do
    if [ -L "$entry" ]; then
      :
    elif [ -d "$entry" ]; then
      if explore "$entry"; then
        keep=1  # Keep this directory, it contains kept directories
      fi
    elif [ -f "$entry" ]; then
      if [ -z "$(find "$entry" -atime +999 -print)" ]; then
        keep=1  # Keep this directory, it contains a recently-accessed file
      fi
    fi
  done
  if ((!keep)); then
    echo "$1"
    return 1
  fi
  return 0
}
explore .
    
por 21.08.2015 / 01:03