我是 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