Фактически find
предоставляет вариант -newerXY
, где XY
- это ссылка, состоящая из любого из следующих:
a The access time of the file reference
B The birth time of the file reference
c The inode status change time of reference
m The modification time of the file reference
t reference is interpreted directly as a time
(см .: man 1 find )
Чтобы найти файлы с временем модификации до заданного времени , вы просто отменяете опцию -newermt "date"
, например ! -newermt "date"
(где дата находится в допустимом формате. с помощью date
utiliity, - yyyy-mm-dd
или yyyy-mm-dd HH:MM:ss
подойдут)
Собирая части вместе, вы можете использовать:
## find files below dir for user modified before "date_given"
find "$1" -user "$2" ! -newermt "$3"
или
## find files below dir for user modified after "date_given"
find "$1" -user "$2" -newermt "$3"
или
## find files below dir for user modified since "days ago given"
find "$1" -user "$2" -newermt $(date -d "$3 days ago" +%F)
Вы также можете использовать -mtime
, хотя и не так гибко. Пока вы просто хотите знать, были ли файлы изменены в течение "days given"
24-часовых периодов go, он будет работать нормально:
## find files below dir for user modified within days given * 24 hour periods
find "$1" -user "$2" -mtime "-$3"
Добавление минимальных проверок для полного сценария, предполагающего, что вы хотите проверьте каждый аспект перед вызовом find
, вы можете сделать:
#!/bin/bash
[ "$#" -ne 3 ] && { ## validate 3 arguments given
printf "error: insufficient arguments\nusage: %s dir user yyyy-mm-dd\n" \
"${0##*/}" >&2
exit 1
}
[ -d "$1" ] || { ## validate 1st is valid directory
printf "error: directory not found '%s'.\n" "$1" >&2
exit 1
}
grep -q "^$2:" /etc/passwd || { ## validate 2nd is valid username
printf "error: invalid user name '%s'.\n" "$2" >&2
exit 1
}
epochsearch="$(date -d "$3" +%s)"
[ "$?" -eq 1 ] && { ## validate 3rd is valid date
printf "error: invalid date format '%s'.\n" "$3" >&2
exit 1
}
[ "$epochsearch" -ge "$(date +%s)" ] && { ## and date in the past
printf "error: date given not in the past '%s'\n", "$3" >&2
exit 1
}
## find files below dir for user modified before "date_given"
find "$1" -user "$2" ! -newermt "$3"
( примечание: , поскольку find
сообщит о неверном каталоге, пользователе и времени, единственная необходимая проверка в том, что дата уже в прошлом. Вам решать, хотите ли вы проверять другие входные данные и обрабатывать ошибки отдельно для регистрации и т. д. c ..)
Заменить любую версию find
команда, необходимая для достижения sh вашей цели.
Посмотрите все и дайте мне знать, если у вас возникнут дополнительные вопросы.