使用 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

答案2

如果您只想要一个备份文件,那么它的简单伪代码如下所示:

Capture list of existing backup files
create new backup file
if new filecreated OK, delete files in list 

如果create new backup file只是复制一个小文件,那么这可能是多余的 - 它不太可能失败。在这种情况下,只需在创建新文件之前删除现有文件即可。但是创建大型 tar/cpio 存档或卸载到后台服务器是另一回事。

但这有点无聊。维护多个备份文件怎么样?如果您知道它们会定期创建,那么您可以这样做:

find $BACKUPDIR -maxdepth 1 -mtime +7 -exec rm -f {} \;

这将保留过去 7 天内创建(或修改)的文件。

或者,如果您想保留多个版本(下面有 12 个版本)......

ls -1 $BACKUPDIR/backup | sort | awk -v KEEP=12 '(NR>KEEP) { print $1 }' | xargs rm -f

答案3

你可以这样做:

# Save the list of files in the backup folder
files=$(ls /backups/backup_[0-9][0-9][0-9][0-9]_[0-9][0-9]_[0-9][0-9]_[0-9][0-9]_[0-9][0-9]_[0-9][0-9].txt)

# [Do your backup here, exit if it fails]

# Delete the files previously in the backup folder
for file in $files
do
    rm -f "${file}"
done

相关内容