Только простые случаи могут быть выражены с помощью &&
и ||
. Конструкция 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).
Вот то, с чего вы можете начать:
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.
Вы можете попробовать следующие сценарии оболочки, используя только find
, sed
,sort
(и echo
для части 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
снова будут искать в каталоге, дата и время доступа останутся прежними (, если только что-то снова не было изменено в каталоге ).
Это примерно так?
$ 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