Portanto, queremos obter os arquivos (regulares) que têm mtime há mais de 7 dias e NÃO estão nos 20 arquivos mais recentes.
Uma maneira de fazer isso é construir uma lista de arquivos junto com seus tempos de modificação e um sinalizador indicando se o arquivo é mtime +7 ou não. Podemos então ordenar a lista por mtime , e pegar todos menos os 20 mais recentes 1 . Por fim, repita a lista resultante e exclua somente aqueles que atendem ao limite de idade:
find ./recentpicturesdirectory -type f \( -mtime +7 -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t%prm ./recentpicturesdirectory/**/*(.^om[1,20]^m+7)
' |
sort -zk2,2 | head -zn -20 | while read -r -d '' flag _ file; do \
case "$flag" in
'Y') echo rm "$file"
;;
*) echo "skipping $file (too new)"
;;
esac
done
Usando termination e adicionando o -zsort flag aos comandos head e tail (ou echo ), podemos manipular qualquer nome de arquivo legal sem nos sufocarmos no espaço em branco.
O head -n -20 é adicionado para fins de teste; remova-o assim que tiver certeza de que os arquivos desejados estão selecionados para exclusão .
1 Se classificarmos em ordem crescente de tempo (ou seja, antigo para novo), podemos usar tail -n +21 para selecionar todos, exceto os últimos 20; alternativamente, poderíamos classificar em ordem decrescente de mtime (novo para antigo) e usar zsh
Se você tem **/* , então você pode fazer tudo com qualificadores glob, eu acho:
print -rl ./recentpicturesdirectory/**/*(.^om[1,20]^m+7)
onde
-
globstarcorresponde recursivamente (equivalente a bash(.)) -
om[1,20]corresponde somente a arquivos regulares -
m+7lista os resultados em ordem crescente de tempo e seleciona os primeiros 20 -
mtimecorresponde apenas a arquivos com^> 7 dias -
regular files NOT (in 20 most recent by mtime OR NOT mtime +7 days)inverte tudo o que se segue
então a lógica é
regular files (NOT in 20 most recent by mtime) AND (mtime +7 days)
que (por aplicação das regras de Morgan) é equivalente a
%code%
Por favor, faça um teste primeiro, por exemplo,
find ./recentpicturesdirectory -type f \( -mtime +7 -printf 'Y\t' -o -printf 'N\t' \) -printf '%A@\t%prm ./recentpicturesdirectory/**/*(.^om[1,20]^m+7)
' |
sort -zk2,2 | head -zn -20 | while read -r -d '' flag _ file; do \
case "$flag" in
'Y') echo rm "$file"
;;
*) echo "skipping $file (too new)"
;;
esac
done