Encontre diretórios com todos os arquivos dentro de mais de X?

5

É possível no linux encontrar diretórios onde todos os arquivos e diretórios contidos (e arquivos de sub-diretórios, etc.) são mais antigos que uma determinada idade? Em outras palavras, se um diretório tiver um ou mais arquivos dentro dele que tenham uma data de modificação mais recente que um determinado limite, esse diretório não deve ser listado. Se todos dos arquivos e pastas abaixo desse diretório forem mais antigos do que o limite dado, então o diretório deverá ser listado.

O caso de uso é que meu diretório pessoal está cheio de diretórios ocultos, e tenho certeza de que muitos deles são remanescentes de instalações anteriores e de software que não uso há anos. Eu gostaria de poder encontrar esses diretórios, para que eu possa facilmente decidir se quer separá-los.

    
por naught101 26.06.2012 / 07:41

5 respostas

5

Provavelmente, é possível fazer isso sem criar arquivos usando a substituição de processos ou algo assim, mas aqui está uma solução rápida e suja:

find . -type f -mtime +30 -printf '%h\n' | sort | uniq > old.txt
find . -type f -mtime -30 -printf '%h\n' | sort | uniq > new.txt
grep -vf new.txt old.txt

O primeiro comando gera o caminho de cada arquivo modificado há mais de 30 dias (em -printf do find - pelo menos com o GNU encontrado no meu sistema - %h imprime o caminho inteiro, exceto o nome real do arquivo) , então, ordena e remove todas as duplicatas, e coloca tudo em um arquivo chamado old.txt .

O segundo comando faz o mesmo, mas com todos os arquivos modificados há menos de 30 dias, e os coloca em outro arquivo, new.txt .

A linha grep imprime todas as linhas do arquivo antigo.txt que não aparecem no arquivo novo.txt - portanto, ele fornecerá uma lista dos diretórios que contêm apenas arquivos que foram modificados pela última vez mais de 30 dias atrás.

Isso tudo está usando as versões GNU dos utilitários. Não sei se a sintaxe corresponde às versões do BSD, etc.

    
por 07.10.2013 / 23:27
2

Finalmente descobri a mágica one-liner:

for dir in 'find . -type d -mtime +30'; do test 'find $dir -type f -mtime -30 -print -quit' || echo $dir; done

Isso imprime todos os diretórios com um tempo de modificação maior que 30 dias e nenhum arquivo modificado nos últimos 30 dias.

    
por 10.02.2016 / 16:35
1

Este deve funcionar:

for DIR in {the folder list}; do
   if [[ $(find ${DIR} -mtime -10 -type f) == "" ]]; then 
        echo ${DIR}
   fi
done

Ele encontra todos os diretórios na {lista de pastas}, que contém arquivos com mais de 10 dias.

Basicamente, o que find ${DIR} -mtime -10 -type f faz é localizar todos os arquivos ( -type f ) que são modificados em 10 dias ( -mtime -10 , que é diferente de -atime ou -ctime , veja aqui para mais informações: link ). Se esses arquivos não forem encontrados em um diretório, saberemos que esse diretório tem mais de 10 dias e geramos esse diretório com echo ${DIR} .

Espero que ajude!

    
por 16.07.2016 / 00:27
0
find -type f -mtime +30

para verificar arquivos com mais de 30 dias

se você adicionar -iname '.*' , ele mostrará os arquivos ocultos

ou -type d para diretórios

    
por 26.06.2012 / 08:00
0

Você pode usar a seguinte solução alternativa para implementar sua necessidade:

$ touch -t 201206010100 some_file
$ find . -newer some_file

Na página de manual de toque:

-t STAMP
    use [[CC]YY]MMDDhhmm[.ss] instead of current time

Existe também a opção -d de toque, mas eu não o usei. Você poderia tentar.

[Editar] você pode usar a opção touch -d da seguinte maneira para gerar um arquivo em uma determinada data:

$ touch -d "Wed Jun 27 09:44:44 EEST 2012" some_file
$ ls -l some_file
-rw-r--r-- 1 user user 0 2012-06-27 09:44 some_file

Você poderia usar a mesma abordagem que mencionei acima

    
por 26.06.2012 / 18:35