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/