0

我正在尝试仅备份一个由其他应用程序在动态命名文件夹中生成的文件。例如:

parent_folder/ 
   back_01 -> file_blabla.zip (timestam 2013.05.12)
   back_02 -> file_blabla01.zip (timestam 2013.05.14)
   back_03 -> file_blabla02.zip (timestam 2013.05.22)

我需要获取最新生成的 zip,只要是最新的,文件名无关紧要,它是一个 zip,并且在“parent_folder”中获取那个。

同样,当我执行 rsync 时,会生成文件夹结构 + 文件名,我想省略我想将该文件备份到一个文件夹中并使用一个名称,这样我就知道最新的在哪里,并且它总是被命名为相同的。

现在我用一个 perl 来做这个,它可以得到最新生成的文件夹

"ls -tAF | grep '/$' | head -1" 

并执行 rsync 但它确实带来了最后一个 zip 但具有我不想要的文件夹结构,因为它不会覆盖我最新的 zip 文件。

rsync -rvtW --prune-empty-dirs --delay-updates --no-implied-dirs --modify-window=1 --include='*.zip' --exclude='*.*' --progress /source/ /myBackup/

如果我可以在不需要使用 perl 或任何其他脚本的情况下执行 rsync,那将是非常棒的。

谢谢

4

1 回答 1

1

文件名每次都会不同?

这对于任何类型的同步都很难工作。

你可以做的是:

  • 在找到它的位置之外创建一个新文件夹,然后:
  • 在开始删除该文件夹中的最后一个符号链接文件之前
  • 找到文件时,即 ls -tAF | grep '/$' | head -1 .... 将其符号链接到此文件夹
  • 然后 rsync,ssh,unison 文件跨越到新节点。
  • 如果符号链接名称是 file-latest.zip,那么它将始终是发送的这个文件。

但是,当您可以 scp 并且您可以在这里查看时,为什么要这样做:

https://github.com/vahidhedayati/definedscp 用于更冗长的方法,而不是针对这种情况,但它使用真实文件日期/时间戳然后转换为秒......如果您希望这样做可能会很有用以不同的方式统计

使用 stat 计算文件,计算出最新文件,然后简单地 scp 它,这里有一些东西可以帮助你开始:

一个班轮:

scp  $(find /path/to/parent_folder -name \*.zip  -exec stat -t {} \;|awk '{print $1" "$13}'|sort -k2nr|head -n1|awk '{print $1}') remote_server:/path/to/name.zip

更冗长的方式,也许有助于理解上面的操作:

#!/bin/bash
FOUND_ARRAY=()
cd parent_folder;
for file in $(find . -name \*.zip); do
  ptime=$(stat -t $file|awk '{print $13}');   
  FOUND_ARRAY+=($file" "$ptime)
done


IFS=$'\n'
FOUND_FILE=$(echo "${FOUND_ARRAY[*]}" | sort -k2nr | head -n1|awk '{print $1}');
scp $FOUND_FILE remote_host:/backup/new_name.zip
于 2013-05-23T17:31:42.907 回答