YYYYMMDDHH 形式の特定のタイムスタンプから N 日より古いファイルを検索したい
以下のコマンドで 2 日以上前のファイルを見つけることができますが、これは現在の時刻のファイルを見つけます。
find /path/to/dir -mtime -2 -type f -ls
timestamp=2011093009
2011093009 から 2 日以上経過したファイルを見つけたいと入力したとします。
調べているのですが、よくわからないようです。
基本的に、これは日付の範囲でファイルを見つけることによって達成されます...
私のシステムではGNU日付が利用できないため、perlを使用して今日から指定されたタイムスタンプまでの日数を計算しました-d
。以下のコードは、YYYYDDMM 形式の日付を受け入れます。下記参照:
#!/usr/bin/perl
use Time::Local;
my($day, $month, $year) = (localtime)[3,4,5];
$month = sprintf '%02d', $month+1;
$day = sprintf '%02d', $day;
my($currentYear, $currentDM) = ($year+1900, "$day$month");
my $todaysDate = "$currentYear$currentDM";
#print $todaysDate;
sub to_epoch {
my ($t) = @_;
my ($y, $d, $m) = ($t =~ /(\d{4})(\d{2})(\d{2})/);
return timelocal(0, 0, 0, $d+0, $m-1, $y-1900);
}
sub diff_days {
my ($t1, $t2) = @_;
return (abs(to_epoch($t2) - to_epoch($t1))) / 86400;
}
print diff_days($todaysDate, $ARGV[0]);
**注: 私は Perl の専門家ではありません。これは、私が変更/作成する最初のコードです。そうは言っても、Perlで上記を達成するためのより良い方法があると確信しています
次に、必要なことを実行するための以下の korn スクリプト。
#!/bin/ksh
daysFromToday=$(dateCalc.pl 20110111)
let daysOld=$daysFromToday+31
echo $daysFromToday "\t" $daysOld
find /path/to/dir/ -mtime +$daysFromToday -mtime -$daysOld -type f -ls
より古いすべてのファイルを+$daysFromToday
検索し、検索をより新しい日付に絞り込んでいます-$daysOld
#!/usr/bin/env bash
# getFiles arrayName olderDate newerDate [ pathName ]
getFiles() {
local i
while IFS= read -rd '' "$1"'[(_=$(read -rd "" x; echo "${x:-0}")) < $2 && _ > $3 ? ++i : 0]'; do
:
done < <(find "${4:-.}" -type f -printf '%p\0%Ts\0')
}
# main date1 date2 [ pathName ]
main() {
local -a dates files
local x
for x in "${@:1:2}"; do
dates+=( "$(date -d "$x" +%s)" ) || return 1
done
_=$dates let 'dates[1] > dates && (dates=dates[1], dates[1]=_)'
getFiles files "${dates[@]}" "$3"
declare -p files
}
main "$@"
# vim: set fenc=utf-8 ff=unix ts=4 sts=4 sw=4 ft=sh nowrap et:
この Bash スクリプトは、2 つの日付とパス名を受け取りますfind
。getFiles
は配列名を取り、2 つの日付の間に mtimes を持つファイルがその配列に割り当てられます。このサンプル スクリプトは、単に配列を出力します。
最近の Bash と GNU の日付が必要です。本当に「N日」でなければならない場合、またはGNUの日付がない場合は、解決策はありません. 別の言語を使用する必要があります。標準ユーティリティを使用してこれを実行できるシェルはありません。
技術的には、いくつかの算術演算を使用して日数でオフセットを計算できますが、printf '%(%s)T' ...
GNU 日付なしでタイムスタンプからベース日付を取得する方法はありません。
編集
この質問には ksh タグが含まれていることがわかりました。その場合、私は嘘をつきました。明らかに、ksh93 の printf は GNU date -d のような文字列を受け入れます。移植可能かどうかはわかりません。もちろん、ksh93 がインストールされたシステムが必要です。その場合、上記のスクリプトにいくつかの変更を加えることでそれを行うことができます。