Bashを使用して、現在の日付に従って名前付きの新しいファイルで古いファイルを上書きします。

Bashを使用して、現在の日付に従って名前付きの新しいファイルで古いファイルを上書きします。

私はLinux初心者で、ファイル名に特定の日付を含むファイルを生成するには、bashスクリプトを作成するのに役立ちます。

/backups/現在の日付と時刻に基づいてプレフィックス付きのテキストを含むファイルを作成したいディレクトリがあります/backups/backup_2023_09_15_14_00_00.txt。たとえば、この部分はすでに答えられています。ここ)。

問題は、古いバックアップファイルがすでに存在し(形式に応じて名前が付けられているbackup_****_**_**_**_**_**.txt)、新しいファイルが正常に作成された場合は、古いバックアップファイルを削除したいということです。

このようなことをする方法はありますか?

ベストアンサー1

次のbashスクリプトフラグメントは、位置引数のリスト(以下の名前付き配列を使用したバリエーションを参照)を使用して、以前のバックアップのすべてのパス名を保存します。新しいバックアップが作成された後(ここではシミュレーションに使用されます)、以前に記憶されたtouchバックアップは削除されます。

# Set backup dir variable and name of the new backup file.
backup_dir=/backups
printf -v backup_name 'backup_%(%Y_%m_%d_%H_%M_%S)T.txt' -1

# Remember any old backups.
shopt -s nullglob  # expand globs to nothing if no match
set -- "$backup_dir"/backup_????_??_??_??_??_??.txt

# Debugging output.
if [ "$#" -gt 0 ]; then
    printf 'Old file: %s\n' "$@"
else
    echo 'No old files'
fi

# Create the new backup at "$backup_dir/$backup_name".
# Terminate if not successful.
touch "$backup_dir/$backup_name" || exit

# Remove old files if there were any.
rm -f "$@"

場所引数リストの代わりに古いバックアップファイルを保存するには、名前付き配列を使用してください。デバッグ出力を生成するために使用される割り当てと拡張を除いて、oldfilesコードは同じです。rm

# Set backup dir variable and name of the new backup file.
backup_dir=/backups
printf -v backup_name 'backup_%(%Y_%m_%d_%H_%M_%S)T.txt' -1

# Remember any old backups.
shopt -s nullglob  # expand globs to nothing if no match
oldfiles=( "$backup_dir"/backup_????_??_??_??_??_??.txt )

# Debugging output.
if [ "${#oldfiles[@]}" -gt 0 ]; then
    printf 'Old file: %s\n' "${oldfiles[@]}"
else
    echo 'No old files'
fi

# Create the new backup at "$backup_dir/$backup_name".
# Terminate if not successful.
touch "$backup_dir/$backup_name" || exit

# Remove old files if there were any.
rm -f "${oldfiles[@]}"

新しいバックアップが正常に作成されなかった場合は、スクリプトを終了するのではなく、ステートメントから古いファイルを削除できます。ifたとえば、次のようになります。

# Create the new backup.
# Remove old files if successful.
if touch "$backup_dir/$backup_file"
then
    rm -f "$@"    # or "${oldfiles[@]}" if you used the array and like typing longer things
fi

おすすめ記事