ディレクトリのサブディレクトリを再帰的に検索し、次のようなスクリプトを作成しようとしています。
- このサブディレクトリで最新のファイルを見つけます。
- 最新のファイルの日付を検索
- ファイルがX日より古いことを確認してください(例:(180))。
- ファイルがX日より古い場合は、そのパスを「OLD.txt」というファイルに出力します。
- ファイルが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