find
UNIX コマンドを使用して、特定の日付に作成されたファイルを検索するにはどうすればよいですか?
9 に答える
Max が指摘したように、できませんが、変更またはアクセスされたファイルをチェックすることはそれほど難しくありません。私はこれについてのチュートリアルを、遅くとも今日まで書きました。その本質は、-newerXY
andを使用すること! -newerXY
です:
例: 2007 年 6 月 7 日に変更されたすべてのファイルを検索するには:
$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08
2008 年 9 月 29 日にアクセスされたすべてのファイルを検索するには:
$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30
または、同じ日に権限が変更されたファイル:
$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30
ただし、ファイルのアクセス許可を変更しない場合、「c」は通常、作成日に対応します。
/home/
このコマンドを使用して、必要に応じて期間を追加してファイルとフォルダーを検索します。
find /home/ -ctime time_period
time_period の例:
30 日以上前:
-ctime +30
30 日以内:
-ctime -30
ちょうど 30 日前:
-ctime 30
それは2つのステップですが、私はこのようにするのが好きです:
まず、特定の日付/時刻でファイルを作成します。この場合、ファイルは 2008 年 10 月 1 日の午前 0 時です。
touch -t 0810010000 /tmp/t
これで、上記のファイルよりも新しいまたは古いすべてのファイルを見つけることができます (ファイルの変更日に従って移動します。また、アクセス済みおよび-cnewerファイルの状態が変更された場合に-anewerを使用することもできます)。
find / -newer /tmp/t
find / -not -newer /tmp/t
touch で 2 つのファイルを作成して、特定の日付の間のファイルを表示することもできます。
touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2
これにより、2 つの日付と時刻の間のファイルが検索されます
find / -newer /tmp/t1 -and -not -newer /tmp/t2
あなたはこれを行うことができます:
find ./ -type f -ls |grep '10 Sep'
例:
[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235 4 -rw-r--r-- 1 root root 29 Dec 24 03:24 /var/lib/prelink/full
798227 288 -rw-r--r-- 1 root root 292323 Dec 24 23:53 /var/log/sa/sar24
797244 320 -rw-r--r-- 1 root root 321300 Dec 24 23:50 /var/log/sa/sa24
できません。-cスイッチは、アクセス許可が最後に変更された日時を示し、-aは最新のアクセス時間をテストし、-mは変更時間をテストします。Linuxのほとんどのフレーバー(ext3)で使用されるファイルシステムは、「作成時間」レコードをサポートしていません。ごめん!
@Max: 作成時間については正しいです。
-atime
ただし、、、、パラメーターのいずれか-ctime
の経過日数引数を計算する場合-mtime
は、次の式を使用できます。
ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))
「2008-09-24」を任意の日付に置き換えると、ELAPSED_DAYS はその日から今日までの日数に設定されます。find
(更新:の日付の丸めに合わせて、結果から 1 を引きます。)
したがって、2008 年 9 月 24 日に変更されたファイルを見つけるには、次のコマンドを実行します。
find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))
これは、のバージョンが@Arve: の回答に記載されている述語find
をサポートしていない場合に機能します。-newerXY
-atime、-ctime、および -mtime スイッチを使用して検索すると、達成したいことに近づくことができます。
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
14 日以上経過したすべてのファイルを削除するスクリプトで、次のスクリプトレットを見つけました。
CNT=0
for i in $(find -type f -ctime +14); do
((CNT = CNT + 1))
echo -n "." >> $PROGRESS
rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG
少し追加の「man find」と -ctime / -atime などのパラメーターを探すと、ここで役立つと思います。