ログの上部にフォルダ名($date)を追加したら、同じログから21行目を切り取り、実行スクリプトに値として追加します。

ログの上部にフォルダ名($date)を追加したら、同じログから21行目を切り取り、実行スクリプトに値として追加します。

スクリプトを作成しようとしましたが、追加する最後の部分でブロックされました。

このスクリプトは、私のサーバーへのいくつかのパスを私のGoogleドライブと同期します。私のサーバーに削除または変更されたファイルがある場合は、/old/date/gdriveのパスに移動します。

oldlog="/boot/logs/old-log.txt"
del=""
date=$(date +"%Y-%m-%d-%H%M")
--backup-dir "${dest}/old/${date}"

これは完全に機能しますが、ファイルを手動で削除する必要があるため、/old/これを変更したいと思います。

だから私に必要なのは、常にログに行1を$date書き、ログ内の他のすべての行を1行下に移動することです。$oldlog書き込み$dateログは書き込みログと一致する必要があるため、$date同じ--backup-dir "${dest}/old/${date}"です。

したがって、ログはxx日の1日後に次のように機能する必要があります。

2019-07-01-1800

2日

2019-07-02-1800
2019-07-01-1800

3日

2019-07-03-1800
2019-07-02-1800
2019-07-01-1800

だから次の部分のために。上記の例のようにログを更新した後、21行目を取得し、そのoldlog.txt行を削除してスクリプトに$del

oldlog="/boot/logs/old-log.txt"
del=
rclone purge "${dest}/old/${del}"

行が空の場合は、内部のすべての内容が消去されないようにランダムなテキストにする必要があります/old/。それとも、より高度なアプローチを使用できますか? if del = emptyのようなものは消去がないことを示すメッセージを表示します。 oldlog.txt で del=value の場合、以下を実行します。rclone purge "${dest}/old/${del}"

oldlog="/boot/logs/old-log.txt"
del=
delempty=echo "nothing to purge today"
delvalue=rclone purge "${dest}/old/${del}"

複雑にならずにスクリプトでこれを実行できますか?

答え1

4つのことをやろうとしています。 1) ファイルの先頭に行を挿入します。

ストリームエディタユーティリティを使用して、sedこれをすべて実行できます。私の答えはGNUを仮定しますsed。しかし、正確な構文は異なるバージョンのsed

ファイルの先頭に行を挿入するには:

sed -i "1i\${date}" ${oldlog}

この-iオプションは、sedファイルがその場所で処理されるように指示します。最初の行でのみ機能するように指示1します。その行の前に挿入するように指示します。sedi\sed

行21を検索するには、次のようにします。

del="$(sed -n 21p "${oldlog}")"

-n自動モードでのみ設定されるため、sed明示的に印刷される内容のみが出力されます。21は行番号で、p印刷コマンドです。

21行目があることを確認してください。

sed -n 21q1 ${oldlog}

sedを-n自動モードに戻し、21行21を選択してsedにq終了するように指示します。これが1終了コードです。

21行目を削除する:

sed -i 21d ${oldlog}

もう一度-iファイルを操作するには、2121行目を選択してd削除します。

一緒に入れてください:

sed -i "1i\${date}" ${oldlog}
del="$(sed -n 21p "${oldlog}")"
sed -n 21q1 ${oldlog} || { echo "Deleting ${dest}/old/${del}" && rclone purge "${dest}/old/${del}" && sed -i 21d ${oldlog} }

関連情報