Сценарий оболочки для отображения всех измененных файлов после нескольких дней назад - PullRequest
0 голосов
/ 25 мая 2020

Я хотел бы знать, как я могу получить все файлы типа * x, которые были изменены пользователем через несколько дней в прошлом. Позиционные параметры будут такими:

  • Каталог, в котором искать
  • Имя пользователя, который изменил файлы
  • Количество дней

Лучший вариант, который я придумал на данный момент, это:

#!/bin/bash

if [ $# -ne 3 ]; then
  echo "3 parameters needed, use ./script.sh path user days"
  exit
else
  find $1 -user $2 -type f -name \*x -mtime -$3 -print 2>&1 | grep -v "Permission denied"
fi

Но, похоже, он не работает и не видит пользователей, которые изменяют файлы, отличные от текущего, даже если у них есть разрешения на файлы.

1 Ответ

1 голос
/ 08 июня 2020

Фактически 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 вашей цели.

Посмотрите все и дайте мне знать, если у вас возникнут дополнительные вопросы.

...