Solução Linux.
Existe uma pergunta semelhante . Baseado em minha resposta lá eu criei um script Bash genérico para resolver esse tipo de problema. Você encontrará o código abaixo. Salve-o em um arquivo chamado findt
(ou outro) e, em seguida, chmod a+x findt
. Coloque-o onde seu $PATH
aponta para ou em outro lugar - suponho que você saiba o básico, a diferença, etc.
Invoque findt -h
para aprender a sintaxe. Trecho:
USAGE
'findt [OPTION]... FROM TO [ARG]...'
SYNOPSIS
Invokes find
command to list objects (files, directories, ...) modified, changed or accessed between FROM
and TO
(inclusive). FROM
and TO
are times given in 24-hour HH:MM
or H:MM
format (00:00
- 23:59
). Modification date (day) does not matter. If FROM
is later than TO
then the interval includes midnight.
OPTIONs
'-h' print this help and exit
'-m' use mtime (default)
'-c' use ctime
'-a' use atime (note: understand 'noatime' mount option etc.)
'-b' use birth time, 'stat -c %w'
(useless, see 'https://unix.stackexchange.com/a/91200')
If more than one ?time
is specified, only the last one matters.
'-p' use '-print' with 'find' (default)
'-0' use '-print0' instead
'-d' use '-delete' with 'find' (non-POSIX)
-d
is silent unless -p
or -0
is also used.
ARGs
Arguments following TO
are passed to find
as its initial arguments.
Specify paths and additional tests (e.g. -type f
) here.
A maior parte do código é para analisar a linha de comando, imprimir a ajuda, etc. A parte funcional do script é find
invocation. É uma solução ligeiramente generalizada da minha resposta já mencionada . É explicado lá, então não vou me repetir aqui.
A ferramenta apenas imprime nomes, a menos que você use -d
. Observe que ele usa HH:MM
do% normal stat -c %y
etc. ignorando informações de fuso horário; se houver diferentes fusos horários envolvidos, talvez você queira ajustar a solução.
No seu caso, você deve executar algo como:
findt 8:00 15:59 /path/to/dir -type f
Este é o código:
#!/usr/bin/env bash
set -e
myname="${0##*/}"
from=-1
to=-1
property=%y
is_print=0
is_zero=0
is_delete=0
post_args=""
conj=-a
main() {
while [ "${1:0:1}" = "-" ]; do
options="${1:1}"
shift
while [ ${#options} -ne 0 ]; do
case "$options" in
h*)
print_help
exit 0;;
m*)
property=%y;;
c*)
property=%z;;
a*)
property=%x;;
b*)
property=%w;;
p*)
is_print=1;;
0*)
is_zero=1;;
d*)
is_delete=1;;
*)
print_error;;
esac
options="${options:1}"
done
done
from='parse_time "$1"'
to='parse_time "$2"'
shift 2
[ $from -gt $to ] && conj=-o
[ $is_delete -eq 0 ] && is_print=1
[ $is_print -eq 1 ] && post_args="-print"
[ $is_zero -eq 1 ] && post_args="-print0"
[ $is_delete -eq 1 ] && post_args="$post_args -delete"
find "$@" -exec bash -c '\
hm='stat -c $4 "$0" | cut -c 12-16'; [ "${#hm}" -eq 0 ] && exit 1 ; \
t=$((60*10#'echo $hm | cut -c 1-2'+10#'echo $hm | cut -c 4-5')); \
test \( $t -ge $1 \) $3 \( $t -le $2 \)' \
{} $from $to $conj $property \; $post_args
}
parse_time() {
time_string="$1"
[ ${#time_string} -eq 4 ] && time_string="0$time_string"
[[ "$time_string" =~ ^[0-2][0-9]:[0-5][0-9]$ ]] || print_error
{ value=$((60*10#${time_string:0:2}+10#${time_string:3:2})); } 2>/dev/null || print_error
[ $value -ge 1440 ] && print_error
printf '%s' $value
}
print_error() {
cat >&2 << EOF
${myname}: error parsing command line
Try '$myname -h' for more information.
EOF
exit 1
}
print_help() {
cat << EOF
USAGE
$myname [OPTION]... FROM TO [ARG]...
SYNOPSIS
Invokes \'find' command to list objects (files, directories, ...) modified,
changed or accessed between FROM and TO (inclusive). FROM and TO are times given
in 24-hour HH:MM or H:MM format (00:00 - 23:59). Modification date (day)
does not matter. If FROM is later than TO then the interval includes midnight.
OPTIONs
-h print this help and exit
-m use mtime (default)
-c use ctime
-a use atime (note: understand \'noatime' mount option etc.)
-b use birth time, \'stat -c %w'
(useless, see https://unix.stackexchange.com/a/91200)
If more than one ?time is specified, only the last one matters.
-p use \'-print' with \'find' (default)
-0 use \'-print0' instead
-d use \'-delete' with \'find' (non-POSIX)
-d is silent unless -p or -0 is also used.
ARGs
Arguments following TO are passed to \'find' as its initial arguments.
Specify paths and additional tests (e.g. \'-type f') here.
EXAMPLES
To list objects in /tmp modified during working hours:
$myname 7:00 14:59 /tmp
To list and delete big files accessed late at night in /home/foo
$myname -apd 23:30 4:30 /home/foo -typef -size +640M
LICENCE
Creative Commons CC0.
EOF
}
main "$@"