タスクは複数の方法で実行できます。
一つの可能性は、単に二回find
を実行することです:
find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -print > "$LOG"
find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -exec rm -f {} +
別の可能性としては、(GNU拡張)-print0
find
へと-0
xargs
に伴ってtee
を使用することです:
find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -print0 |
tee "$LOG" |
xargs -0 rm -f
このバージョンでログファイルの各ファイル名の最後にヌルバイトが入ります。あなたが可能なあいまいさを気にしない場合には改行を有するものを置き換えるために手配することができます:
find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -print0 |
tee >(tr '\0' '\n' >"$LOG") |
xargs -0 rm -f
これは改行'\n'
にNULLバイト'\0'
をマッピングするためにtr
てログファイルを渡すためにバッシュ(およびKornシェル)process substitutionを使用しています。
printf '%s\n' "[email protected]" >> "$LOG"
rm -f "[email protected]"
をしてから使用してください:
それは小さなカスタムスクリプトを記述することであることのもう一つの方法(remove-log.sh
をそれを呼び出す)スクリプトがの値を参照する必要が
find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -exec bash remove-log.sh {} +
に留意されたいです。 $LOG
であるため、環境変数としてエクスポートする必要があります。それはおそらく勝ったものの、スクリプトが(複数回呼び出される可能性があるため、これらの両方を追加する>>
を使用することを
find "$LOG_ARCHIVE" -mtime +"$DAYS_TO_KEEP_LOGS" -exec bash remove-log.sh "$LOG" {} +
注:
logfile="$1"
shift
printf '%s\n' "[email protected]" >> "$logfile"
rm -f "[email protected]"
プラス:あなたは明示的にログ名を渡すことで、これを避けることができ't be)。 find
コマンドを実行する前に、ログファイルが空であることを確認する必要があります。
find
のパス引数から/*
を削除しました。それは本当に必要ではありませんでした。ファイルのみを削除するには、-type f
を追加するとよいでしょう。 +
は、xargs
を明示的に使用する必要なしに、xargs
のようにむしろfind
を動作させるfind
のPOSIX 2008仕様の機能です。
find: '-exec 'への引数がありません – algorhythm
@algorhythmバックスラッシュセミコロンを逃したと思います。 – pdg
ahhはいバックスラッシュは削除されました。今はエラーはありませんが、ファイルは削除されていません – algorhythm