【问题标题】:scripting a deletion of backed up files after backup is complete in linux在linux中备份完成后编写删除备份文件的脚本
【发布时间】:2016-07-27 21:01:59
【问题描述】:

所以我的备份程序将备份存档文件。然后我想列出它们并将它们从服务器中删除。成功备份后会创建一个日志文件,名称为 000000#.XLOG。我可以使用以下命令从日志中获取文件:

猫 00000008.XLOG | grep 字符串1 | awk '{打印 $7}' |剪切 -d '>' -f2 |剪切 -d '

然后我可以删除这些文件。

我需要帮助的是如何动态搜索正确的备份日志文件(刚刚发生的备份),以便能够抓取文件并删除它们。任何建议表示赞赏。我正在考虑以某种方式在脚本开头获取时间戳,然后从比所述时间戳更新的任何 .xlog 文件中获取信息,因为应该只有一个,因为脚本制作时间戳,启动备份,然后抓取文件并删除它们。我只是不知道它的语法。

任何帮助或进一步的建议将不胜感激。

ls -l 存储日志文件的目录:

-rw-rw-rw- 1 根根 2154 Feb 29 23:46 00000001.CAT

-rw-rw-rw- 1 root root 10153 Feb 29 23:46 00000001.XLOG

-rw-rw-rw- 1 根根 1308 Mar 6 03:22 00000002.CAT

-rw-rw-rw- 1 root root 5257 Mar 6 03:22 00000002.XLOG

-rw-rw-rw- 1 根根 1276 Mar 6 03:23 00000003.CAT

-rw-rw-rw- 1 root root 4565 Mar 6 03:23 00000003.XLOG

-rw-rw-rw- 1 根根 1280 Mar 6 03:26 00000004.CAT

-rw-rw-rw- 1 root root 4662 Mar 6 03:26 00000004.XLOG

-rw-rw-rw- 1 根根 1278 Mar 6 03:27 00000005.CAT

-rw-rw-rw- 1 root root 4748 Mar 6 03:27 00000005.XLOG

-rw-rw-rw- 1 根根 1278 Mar 6 03:29 00000006.CAT

-rw-rw-rw- 1 root root 4838 Mar 6 03:29 00000006.XLOG

-rw-rw-rw- 1 根根 1280 Mar 6 03:30 00000007.CAT

-rw-rw-rw- 1 root root 5881 Mar 6 03:30 00000007.DTA

-rw-rw-rw- 1 根根 1240 Mar 6 03:30 00000007.DTX

-rw-rw-rw- 1 root root 4929 Mar 6 03:30 00000007.XLOG

-rw-rw-rw- 1 根根 14019 Mar 31 04:43 00000008.CAT

-rw-rw-rw- 1 root root 220750 Mar 31 04:43 00000008.DTA

-rw-rw-rw- 1 根根 12160 Mar 31 04:43 00000008.DTX

-rw-rw-rw- 1 root root 97720 Mar 31 04:43 00000008.XLOG

-rw-rw-rw- 1 root root 768 Mar 31 04:43 BackupStatus.xml

-rw-rw-rw- 1 root root 768 Mar 31 21:22 RestoreStatus.xml

-rw-rw-rw- 1 root root 5360 Mar 31 21:22 RST20160331-212219.XLOG

-rw-rw-rw- 1 根根 1533 Mar 31 21:22 SYNCH.DAT

-rw-rw-rw- 1 根根 1533 Mar 31 21:22 SYNCH.MIR

我的命令的输出:

/dir/dir/dir/arch.log

/dir/dir/dir/arch2.log

/dir/dir/dir/arch3.log

等等

这是文件的总体布局:

<M ID="4384" O="VV" C="BKUP" S="I" T="2016-03-08T09:43:52. 0-08:00"></M>

<M ID="4314" C="BKUP" S="I" T="2016-03-08T09:43:52. 0-08:00"><PS><P T="0">7.20.5420 Oct 21 2013 12:01:35</P></PS></M>

<M ID="4127" C="BKUP" S="I" T="2016-03-08T09:43:52. 0-08:00"><PS><P T="1">2016-03-08T09:43:52. 0-08:00</P></PS></M>

【问题讨论】:

  • 请在相关目录中显示“ls -l”的结果,加上您的单行命令的输出,最后是包含时间戳的文件的重要摘要。
  • 所以......你是说你真正想要的是删除刚刚成功完成的备份源吗?有没有可能这是XY Problem,而你真正想要使用的是rsync --remove-source-files
  • 这正是我想做的。唯一的问题是我必须使用我的备份程序作为公司要求和保留/压缩/加密目的。我可以获得“源文件”的唯一方法是从当前的 00000#.XLOG 中获取它们,因为这是唯一列出它们的东西。这会随着每次备份而改变,并在备份完成后写入。

标签: linux bash shell awk archive


【解决方案1】:

成功备份后会创建一个日志文件为 000000#.XLOG

我需要帮助的是如何动态搜索正确的备份日志文件(刚刚发生的备份)以便能够抓取文件并删除它们。

总的来说,我知道创建的最后一个 .XLOG 文件是与上一次成功备份相关联的文件。

列出最后创建的 .XLOG 文件:

ls -1rt *.XLOG | tail -n 1 

使用您的单行命令:

grep string1 $(ls -1rt *.XLOG | tail -n 1) | awk '{print $7}' | cut -d '>' -f2 | cut -d '<' -f1 | grep string2 | grep .log

----

如果文件名中有特殊字符,则有以下安全版本:

find . -type f -printf "%T@ %p\0"  | awk 'BEGIN {RS="\000";} {if (!newesttimestamp || ($1 > newesttimestamp)) {newesttimestamp=$1;newestline=$0;}} END{if (newestline) {print substr(newestline,23);}}'

使用您的单行命令:

grep string1 $(find . -type f -printf "%T@ %p\0"  | awk 'BEGIN {RS="\000";} {if (!newesttimestamp || ($1 > newesttimestamp)) {newesttimestamp=$1;newestline=$0;}} END{if (newestline) {print substr(newestline,23);}}') | awk '{print $7}' | cut -d '>' -f2 | cut -d '<' -f1 | grep string2 | grep .log

----

已经提供的命令已经过示例测试,除了更新的单行代码。

以下命令未经测试。

使用最后一个 while 块测试单行命令:

$ grep string1 $(find . -type f -printf "%T@ %p\0"  | awk 'BEGIN {RS="\000";} {if (!newesttimestamp || ($1 > newesttimestamp)) {newesttimestamp=$1;newestline=$0;}} END{if (newestline) {print substr(newestline,23);}}') | awk '{print $7}' | cut -d '>' -f2 | cut -d '<' -f1 | grep string2 | grep .log | while read -r line; do printf "%s\n" "${line}"; done

一切正常后,将最后一个 while 块中的 printf 替换为 rm

$ grep string1 $(find . -type f -printf "%T@ %p\0"  | awk 'BEGIN {RS="\000";} {if (!newesttimestamp || ($1 > newesttimestamp)) {newesttimestamp=$1;newestline=$0;}} END{if (newestline) {print substr(newestline,23);}}') | awk '{print $7}' | cut -d '>' -f2 | cut -d '<' -f1 | grep string2 | grep .log | while read -r line; do rm -- "${line}"; done

【讨论】:

  • 嗯,我得试试这个。我能看到的唯一可能的问题是 00000#.XLOG 文件不是目录中唯一的 .XLOG 文件。有用于恢复和同步的 .XLOG 文件。
  • 另外,如果我将它通过管道传输到 .lst,我该如何浏览该列表文件并删除列表中的单独文件?他们将拥有完整的路径。
  • @invaderzimpoo 答案已更新,请看底部。
  • 我太傻了。这如何与我的一个班轮集成?
  • @invaderzimpoo 您可以使用带有最终&gt; filesToDelete.lst 的单线,底部已更新为另一种解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2021-08-18
  • 1970-01-01
  • 2012-12-20
相关资源
最近更新 更多