Linux脚本变量到SCP并删除文件

时间:2018-02-17 07:28:32

标签: linux shell centos

我希望设置一个脚本来执行以下操作:

1st:SCP每月第一天的目录到另一台服务器

第二:成功转移后删除目录

我需要移动的目录将始终具有不同的名称,编号最小的目录始终是需要移动的目录:

2018 /文件/ 02 /

2018 /文件/ 03 /

所以我想写的东西是这样的:

scp /2018/files/% user@host:/backups/2018/files/
{where % = lowest num} && 
rm -rf /2018/files/%
{where % = lowest num} &&
exit

感谢您的任何建议

2 个答案:

答案 0 :(得分:1)

如果您愿意使用Ruby,可以使用以下内容完成它:

def file_number(filespec)
  filespect.split('/').last.to_i
end

directories = Dir['/2018/files'].select { |f| File.directory?(f) }
sorted_dirs = directories.sort_by do |dir1, dir2|
  file_number(dir1) <=> file_number(dir1)
end

dir_to_copy = sorted_dirs.first
destination_dir = File.join('/', 'backups', dir_to_copy)

`scp #{dir_to_copy} user@host:#{destination_dir}`
`rm -rf #{dir_to_copy}`

我没有对此进行测试,但如果您有任何问题,请告诉我它们是什么,我可以和您一起解决。

虽然使用shell脚本消除了对Ruby解释器的需求,但对我来说代码并不是那么简单。

在非常大的目录列表中(可能是10,000个?),排序可能会非常缓慢,需要另一种方法来优化速度。

我会提醒你不要在备份后做一个无条件的rm -rf - 这对我来说似乎有风险。

答案 1 :(得分:0)

这里的一大挑战是实际找到要复制的正确文件, shudder ,删除。所以让我们称之为第0步。

让我们从一些锅炉板开始

sourceD=/2018/files/ 
targetD=/backups/2018/files/

还有little assertion,如果$1不等同于目录,则会从脚本中退出。

assert_directory() { (cd ${1:?directory name}) || exit; }

步骤0:确定目录:

assert_directory $sourceD
to_be_archived=$(
  # source must be two characters, hence "??"
  # source must a directory, hence trailing "/"
  # set -- sorts its arguments
  # First match must be our source
  set -- $sourceD/??/ &&
    assert_directory "$1"
    echo ${1:?nothing found}
) || exit

这只是几行压缩代码。请注意,这可能 如果你(不小心)连续多次运行,会导致麻烦。

步骤1,现在复制文件似乎很容易。

scp -r ${to_be_archived:?} user@host:${targetD:?}

这是一种复制文件的简单方法,但速度慢且风险大。 查找rsync超过ssh的替代方案。

第2步,删除

rm -fr行将完成这项工作,但我不会在此处包含此内容。 我们缺少必要的一步,因为我们需要确保我们的 文件安全到达。同样,rsync可以选择。

总结:

assert_directory() { (cd ${1:?directory name}) || exit; }

assert_directory $sourceD
to_be_archived=$(
  set -- $sourceD/??/ &&
    assert_directory "$1"
    echo ${1:?nothing found}
) || exit

这将为您提供sourceD中的第一个双字符名称目录(如果存在)或中止正在运行的脚本。如果$sourceD包含空格,它将会中断。