我希望设置一个脚本来执行以下操作:
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
感谢您的任何建议
答案 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
包含空格,它将会中断。