Использование «Найти» для списка каталогов, которые не были доступен с определенной даты?

Только простые случаи могут быть выражены с помощью && и || . Конструкция if является более общей. , если СОСТОЯНИЕ; затем FOO; fi эквивалентен CONDITION && FOO (при условии правильного использования фигурных скобок для разделения блока, если необходимо), но как только появляется else (или elif ), это вообще невозможно.

if CONDITION; then FOO; else BAR; fi

не эквивалентно

CONDITION && FOO || BAR

. Если УСЛОВИЕ истинно, обе конструкции выполняют FOO . Если FOO ложно, то конструкция if пропускает BAR , тогда как конструкция &&… || выполняет BAR ].

И нет, вы не можете обойти это с помощью CONDITION && {FOO; правда; } || BAR . Это заставляет составную команду возвращать истину, если CONDITION истинно, а FOO - ложно, тогда как , если CONDITION; затем FOO; else BAR; fi в этом случае возвращает false.

Это из-за смысловой разницы. Кроме того, есть удобочитаемость: вложенное использование && и || очень быстро становится трудным для расшифровки. Фактически, я не рекомендую использовать оба в одной команде - особенно с учетом того, что два оператора имеют одинаковый приоритет в оболочке, тогда как они имеют разные приоритеты в C и большинстве других языков, основанных на C (включая Perl и Ruby).

0
19.12.2018, 03:48
3 ответа

Вот то, с чего вы можете начать:

MY_DATE="2018-12-19 06:30"
for i in $(find. -type d)
do
    if [[  $(date -d"$(stat $i | grep ^Access | tail -1 | awk '{print $2 " " $3}')" +%s) -gt $(date -d"$MY_DATE" +%s) ]]
    then
        echo $i
    fi
done

Это не будет работать с каталогами, в пути которых есть пробелы.

Сценарий просто перебирает все каталоги, найденные из того места, где вы его запускаете (вы можете изменить это, изменив команду find )и запустив статистику по ним, сравнивая дату доступа с датой, указанной в MY _Переменная DATE.

0
28.01.2020, 02:41

Сценарии оболочки

Вы можете попробовать следующие сценарии оболочки, используя только find, sed,sortechoдля части Usage ). findможет делать то же, что и stat. Единственное отличие — это символ !, который отменяет проверку -newerat.

olderdate:

#!/bin/bash

if [ $# -ne 2 ]
then
 echo "Usage:   $0 <reference date> <directory> "
 echo "Example: $0 2018-11-30."
 exit
fi

find "$2" -type d ! -newerat "$1" -printf "%AY-%Am-%Ad %AT  %p\n" |
 sed -e 's%\..*  /%     /%' \
     -e 's%\..*  \.%    .%' | sort

newerdate:

#!/bin/bash

if [ $# -ne 2 ]
then
 echo "Usage:   $0 <reference date> <directory> "
 echo "Example: $0 2018-11-30."
 exit
fi

find "$2" -type d -newerat "$1" -printf "%AY-%Am-%Ad %AT  %p\n" |
 sed -e 's%\..*  /%     /%' \
     -e 's%\..*  \.%    .%' | sort

Вы указываете не только дату, но и время, hours, hours:minutesили hours:minutes:seconds, если вы указываете второй параметр,

./olderdate '2018-12-19 18' /path

Комментарий об «автоматической» модификации времени доступа

Я провел небольшое тестирование и заметил, что в некоторых случаях findили statизменяют дату и время доступа к просматриваемым каталогам. Вроде как это произойдет, когда что-то изменилось в каталоге, но время доступа к самому каталогу не обновилось.

В этих случаях время доступа будет установлено на текущее время. Но когда findили statснова будут искать в каталоге, дата и время доступа останутся прежними (, если только что-то снова не было изменено в каталоге ).

1
28.01.2020, 02:41

Это примерно так?

$ cd ~

# adate for./Pictures/
$ stat -c %x./Pictures/
2018-05-18 11:08:44.326743397 -0400

# adate for./Music/
$ stat -c %x./Music/
2018-05-18 11:08:44.325743396 -0400

# Change das adate for./Music/:
$ ls -la./Music/
drwxr-xr-x. 2  leeand00 leeand00     6 May 18 2018 .
drwx------. 24 leeand00 leeand00  4096 Dec 11 09:54.. 

# Read the adate for./Music/ to see that it changed:
$ stat -c %x./Music/
2018-12-19 23:35:04.789892164 -0500

# Read the adate from./Pictures/ to see that it did not change:
$ stat -c %x./Pictures/
2018-05-18 11:08:44.326743397 -0400

# Don't re-invent the wheel:
# `-type d` (look for folders only)
#
# `-maxdepth 1` (Only look inside this directory for folders, 
#                don't descend lower than that)
#
# `-amin -300` ()
#
$ find. -maxdepth 1 -type d -amin -300
.
./Music
0
28.01.2020, 02:41

Теги

Похожие вопросы