例1:最新のタイムスタンプを持つファイルを一覧させる例2:最新のタイムスタンプを持つファイルが存在するディレクトリを一覧させる追記:各ディレクトリで一番新しいファイル一覧が欲しいんじゃUnixで最新のファイルがあるディレクトリ一覧を作る2015/02/15解説入れておけよ、と高飛車に言われたので小心者の私は従いました。2015/02/12awkコマンド使用でつっこみあったので対応2015/02/11自分の理解の整理も兼ねてのメモ。「最新のファイル」の定義ここで言う「最新のファイル」は、「1日前からスクリプト実行日時まで」のタイムスタンプを持つファイルを指すものとする。オプションを適用し、コマンド実行日時を「最新の日時」と定め、この日時を元にファイルのタイムスタンプの条件を設定している。sortfindコマンドでファイル一覧を出力。以降に配置されているファイルが対象。1000バイト以下のファイルが対象。コマンド実行時刻から1日前までのタイムスタンプを持つファイルが対象。sortコマンドでソートをかけた一覧に変更。sortfindコマンドでファイル一覧を出力。以降に配置されているファイルが対象。1000バイト以下のファイルが対象。コマンド実行時刻から1日前までのタイムスタンプを持つファイルが対象。sedコマンドでファイル一覧のファイルの部分を削除。-Eオプションで正規表現の解釈を拡張正規表現へ変更。+記号や$記号が意図したように効かなかった為。正規表現の意味は「“/“で始まり”/“以外の文字で1文字以上行末まで続く部分」。sedのs関数で正規表現に一致した部分を“”に置き換え、つまり削除。結果、ディレクトリ部分のみ残る。uniqコマンドでディレクトリ名の重複を消す。uniqコマンドで同一の内容を持つ複数行を1行にさせる。同じディレクトリに同じタイムスタンプのファイルがあった場合、同じディレクトリの行が重複して残る。uniqコマンドの出力で問題なければsortコマンドは使わなくてもいい。別に最短一致させなくても大丈夫じゃないか、の指摘があったのでawkコマンドからsedコマンドに置き換えした。fidonefor文がfindコマンドの出力行数だけdo~doneの間の処理を繰り返す。10行出力されたなら10回ループ。変数$argに行の内容が入る。以降に配置されているサブディレクトリの一覧を出力。lsコマンドでfindコマンドの示すサブディレクトリ内の一覧を出力。タイムスタンプの昇順に出力される。-F:ディレクトリの名前の最後に”/“が付与される。-1:ファイル名、ディレクトリ名だけ表示。-t:タイムスタンプでソート。-r:ソートを降順から昇順に変える。grepコマンドで最後が”/“の行をフィルタして出力しない。正規表現の意味は「”/“が行末である」。指定の正規表現に合致する行を出力しない。lsコマンドの出力で行末が”/“の行はディレクトリだから処理対象にしない。tailコマンドはheadコマンドの逆。指定で入力した一覧の最終行を出力。最終行はそのディレクトリ内で一番新しいファイルを指す。if文の行はファイルが存在しないディレクトリだった時の為のもの。指定の文字列が長さゼロではないか否かの判定。長さゼロでなければ真。ワンライナーにする方法が思いつかなかったので、シェルスクリプトでfindコマンドの出力結果でループしながらディレクトリ毎に確認しています。新しいファイル(タイムスタンプが同じファイル)が二つ以上ある場合、どれが採用されるのかはファイル名によって決まるんじゃないかな。