最新のファイルを検索し、ファイルが「X」日付より古いことを確認してください。

最新のファイルを検索し、ファイルが「X」日付より古いことを確認してください。

ディレクトリのサブディレクトリを再帰的に検索し、次のようなスクリプトを作成しようとしています。

  1. このサブディレクトリで最新のファイルを見つけます。
  2. 最新のファイルの日付を検索
  3. ファイルがX日より古いことを確認してください(例:(180))。
  4. ファイルがX日より古い場合は、そのパスを「OLD.txt」というファイルに出力します。
  5. ファイルがX日より古くない場合は、そのパスを「YOUNG.txt」というファイルに出力します。

今はそれがすべてです。 findコマンドでファイルから日付を取得し、if / then比較を実行する方法がわかりません。

#!/bin/bash
for d in /u1/?/*/Maildir/new ;
do FILE=$(find "$d" -printf '%T+ %p\n' | sort -r | head >> Test.txt)
done

同様のコードに対する他の試み:

#!/bin/bash
echo "Find files older & younger than X days"
echo "Type the number of X days and hit 'Enter':"
read PERIOD
for d in /u1/?/*/Maildir/new ;
do FILE=$(find "$d" -type f -mtime +$PERIOD -exec ls {} \; >> OLDER.txt)
done
for d in /u1/?/*/Maildir/new ;
do FILE=$(find "$d" -type f -mtime -$PERIOD -exec ls {} \; >> YOUNGER.txt)
done
echo "COMPLETE!"
echo "Check 'OLDER.txt' and 'YOUNGER.txt' files in current directory for output"

最後のファイルの問題は、すべてのファイルを出力することです。一方、ディレクトリで最新のファイルだけを探し、最新のファイルがX日より古いことを確認してください。

答え1

bash最高のケースではありません。

そしてzsh

#! /bin/zsh -
period=${1?Period not given}
for d (/u1/?/*/Maildir/new) {
  newest=($d/*(DN.om[1]))
  (($#newest)) || continue

  over=($newest(Nm+$period))
  if (($#over)); then
    ls -ld $newest >> OLDER.txt
  else
    ls -ld $newest >> YOUNGER.txt
  fi
}

答え2

これはbashバージョンです。

#!/bin/bash
maildir='/u1/?/*/Maildir/new'
DAYS_OLD=180

for d in $maildir ; do
    if [ -d "$d" ] ; then
        FILE="$d/"$(ls "$d" -t1  | head -n 1)
        echo $FILE
        if test $(find "$FILE" -mtime +$DAYS_OLD) ; then
            echo $FILE >> OLDER.txt
        else
            echo $FILE >> YOUNGER.txt
        fi
    fi
done

関連情報