BASHはタイムスタンプでrmの出力をどのように保存しますか?

BASHはタイムスタンプでrmの出力をどのように保存しますか?

これはほぼ終わりました。 CRONで実行して最後の10個のバックアップを維持し、他のアイテムを削除するスクリプト。すべてが正しいことを確認するために追跡するために記録したいと思います。作業して作成しました。どのファイルが削除されたのか、残念ながらタイムスタンプのプレフィックスを設定できません。

TIMESTAMP=$(date +%d-%m-%Y-%H-%M-%S)
LOGFILE="/home/user/place/backups/backuplog.txt"
echo "$TIMESTAMP, " | ls -1tr | head -n -10 | xargs -d '\n' rm -f -v >> $LOGFILE

答え1

ts次のコマンドを使用できます。

ts [-r] [-i | -s] [format]

このように:

TS_FORMAT="%d-%m-%Y-%H-%M-%S, "
LOGFILE="/home/user/place/backups/backuplog.txt"
ls -1tr | head -n -10 | xargs -d '\n' rm -f -v | ts "${TS_FORMAT}" >> $LOGFILE

ts含まれるmoreutilsパック。

更新:追加の依存関係をインストールする必要はありません。

以下を再利用できますxargs

TIMESTAMP=$(date +%d-%m-%Y-%H-%M-%S)
LOGFILE="/home/user/place/backups/backuplog.txt"
ls -1tr | head -n -10 | xargs -d '\n' rm -f -v | xargs -L 1 -d '\n' echo "${TIMESTAMP}, " >> $LOGFILE

もう1つの可能性は、以下を使用することですsed

TIMESTAMP=$(date +%d-%m-%Y-%H-%M-%S)
LOGFILE="/home/user/place/backups/backuplog.txt"
ls -1tr | head -n -10 | xargs -d '\n' rm -f -v | sed "s/^/${TIMESTAMP}/" >> $LOGFILE

使用awk:

LOGFILE="/home/user/place/backups/backuplog.txt"
ls -1tr | head -n -10 | xargs -d '\n' rm -f -v | awk '{ print strftime("%d-%m-%Y-%H-%M-%S"), $0}' >> $LOGFILE

など。

答え2

私はこの問題に対してループベースのアプローチを提案したいのですが(私たち全員が一行を好むが)、読みやすくなります。もちろん、CRONではコードを直接実行するのではなく、このスクリプトファイルを呼び出すだけです。

strings=`ls -1tr | head -n -10`
for file in $strings; do
      rmOutput=`rm -f -v $file`
      echo `date +%d-%m-%Y-%M-%S`: $rmOutput >> $LOGFILE
 done

関連情報