Похоже, что значение "execute only" не имеет особого смысла для файла, но его можно использовать для предотвращения чтения содержимого каталога.
$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
Использование dateadd
и dategrep
из dateutils:
dategrep -i "%Y/%m/%d %T" ">=$(dateadd now -30d)" </path/to/logfile
dateadd
вычисляет дату и время от настоящего момента до 30 дней назад. Затем dategrep
печатает только строки из стандартного ввода, которые содержат строку даты, более новую или равную (>=
), чем эта. В этом случае формат даты строк журнала должен быть указан с помощью -i
.
Если вы можете быть уверены, что для каждого дня будет хотя бы одна запись, вы можете сказать:
sed -n '\|'$(date +'%Y/%m/%d' -d '30 days ago')'|,$p' log
При условии, что у вас есть GNU sed
. Если нет, вам нужно избежать косых черт в дате.
Если у вас естьperl
:
perl -MPOSIX -ni -e '
BEGIN{$cutoff = strftime("%Y/%m/%d %T", localtime(time - 30*86400))}
print if $_ ge $cutoff' file.log
Если у вас GNUdate
:
file=file.log
{
rm -f -- "$file" &&
awk -v "cutoff=$(date -d '30 days ago' '+%Y/%m/%d %T')" '
$0 >= cutoff' > "$file"
} < "$file"
Оба в несколько строк для ясности, но не стесняйтесь помещать их в одну строку, если это то, что вам нужно (вам понадобится ;
между file.log
и {
и между "$file"
и }
при соединении строк варианта awk
.