
2日後のディレクトリとその内容を削除する必要があるスクリプトを作成しました。スクリプトは正常に動作しますが、ディレクトリは削除されません。助けてください。本当にありがとうございます。
スクリプトの詳細:
export BACKUP_SETS=/backupset/
if [ ! -d "$BACKUP_SETS" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
printf "\nFailure when removing BACKUP_SETS, Exiting \n"
exit 1
else
two_days=$(date -d "2 days ago" +%Y_%b_%d)
for f in $BACKUP_SETS[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]; do
[ -d "$f" ] || continue
(( $f < $two_days )) && echo rm -r "$f"
done
printf "\n BACKUP_SETS was removed successfully.\n"
fi
このディレクトリには以下のフォルダが含まれています。
[oracle@ backupset]$ ls -lrt
total 12
drwxr-xr-x 2 oracle dba 12288 Jul 23 18:32 2018_Aug_23
スクリプト出力:
[oracle@ backupset]$ ./backupset.sh
BACKUP_SETS was removed successfully.
答え1
ワイルドカードが$BACKUP_SETS[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
ディレクトリ名と一致しません2018_Aug_23
。
ディレクトリ名を指定すると、20180823
スクリプトでそれを表示できます。また、名前付き月は正しく比較されません(Apr
< Mar
)。
ディレクトリ名を読みやすくするには、ディレクトリ名を指定して2018-08-23
ワイルドカード文字を使用できます$BACKUP_SETS[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
。
答え2
コメントで述べたように、次のように<
月名を比較することはできません。
(( '2018-Aug-29' < '2018-Feb-28' )) && echo 'Uh oh, August is before February' || echo 'Sanity prevails'
Uh oh, August is before February
日付文字列を語彙的に比較するには、YYYY-MM-DD形式を使用することをお勧めします。
しかし、より良いアプローチは、次のように古いfind
ディレクトリを削除することです。
find "$BACKUP_SETS" -mindepth 1 -maxdepth 1 -type d -mtime +2 -print -exec echo rm -rf {} \;
言うまでもなくecho
実際に実行したい場合は、削除してください。
答え3
find "$BACKUP_SETS" -type f -mtime +2 -exec rm {} \;
find "$BACKUP_SETS" -type d -mindepth 1 -mtime +2 -exec rmdir {} \;
このディレクトリは、数日後に最新のファイルとともに削除されます。