Esta linha semi-única imprime os arquivos "noturnos":
( \
llimit=$((60*5+0)); \
ulimit=$((60*22+45)); \
find -type f -exec bash -c '\
hm='stat -c "%y" "$0" | cut -c 12-16'; \
t=$((60*10#'echo $hm | cut -c 1-2'+10#'echo $hm | cut -c 4-5')); \
test \( $t -lt $1 \) -o \( $t -gt $2 \)' \
{} $llimit $ulimit \; \
-print \
)
Sub linhas explicadas:
- Inicia um subshell para tornar as variáveis locais.
- Calcula o limite inferior em minutos depois da meia-noite.
- Calcula o limite superior.
- Para cada arquivo, um
bash
separado é executado; fará a aritmética.
- Extrai o mtime como
HH:MM
.
- Converte
HH:MM
em um valor como minutos depois da meia-noite.
- Compara esse valor com limites pré-calculados.
- Estes são argumentos para o interior
bash
; dentro, eles são referidos como $0
, $1
, $2
.
- Imprime o caminho se o teste anterior retornar verdadeiro.
- Termina o subnível.
Algumas observações:
-
-exec
pode atuar como um teste em find
invocação. Isso dificilmente é óbvio, mas muito poderoso. Nesse caso, o teste é verdadeiro quando a parte final da linha de comando interna bash
(ou seja, test
) retorna verdadeiro (ou seja, seu status de saída é 0
).
- A aritmética de bash (
$((…))
) analisa 01
ou mais como um número octal, 08
e 09
são números octais inválidos. É por isso que precisamos usar 10#
para garantir que todos os números extraídos da saída stat
sejam interpretados como decimais.
- usei
-lt
e -gt
em test
. Use -le
e / ou -ge
se eles forem mais adequados para você.
- Para remover arquivos, substitua
-print
por -delete
(ou use-os juntos: -print -delete
).
-
Para mover arquivos para um único diretório, substitua -print
por -print0
e crie um canal como este:
( … find … -print0 ) | xargs -0r mv -t /target/directory/