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 -z
sort
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
-
globstar
corresponde recursivamente (equivalente a bash(.)
) -
om[1,20]
corresponde somente a arquivos regulares -
m+7
lista os resultados em ordem crescente de tempo e seleciona os primeiros 20 -
mtime
corresponde 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