このstat
コマンドを使用して、ディレクトリに最後にアクセスした日付を表示してフォーマットします。これadate
find
特定の日付より前に変更されたディレクトリを見つける方法はありますか?test
答え1
シェルスクリプト
find
sed
、、、、sort
(およびecho
「使用」部分)のみを使用して、次のシェルスクリプトを試すことができます。find
できることはできるstat
。唯一の違いは、!
テストを無効にする文字の1つです-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
、2番目の引数を引用するhours:minutes
場合hours:minutes:seconds
./olderdate '2018-12-19 18' /path
アクセス時間の「自動」修正の説明
いくつかのテストを行った結果、場合によっては検索ディレクトリのアクセス日時が変更される可能性があることがわかりましたfind
。stat
これは、ディレクトリの内容が変更されたがディレクトリ自体のアクセス時間が更新されていない場合に発生するようです。
この場合、アクセス時間は現在時刻に設定されます。ただし、ディレクトリを再度検索すると、find
アクセスstat
日時は変わりません(ディレクトリに再度変更がない限り)。
答え2
次のように起動できます。
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コマンドを変更して変更できます)、そのディレクトリに対してstatを実行してアクセス日をMY_DATE変数に指定された日付と比較します。
答え3
これは正しいですか?
$ 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