自动查找相关文件.上传到服务器
#!/usr/bin/ruby
# coding: utf-8
require 'date'
$result = []
bak_ser = "bacula@192.168.100.24"
tar_dir = "/tmp/auto_tar_bak"
def check(top_dir, ext_type, exclude, dir_deep)
content = `ls -1 #{top_dir}`.split
for i in content
i = top_dir + "/" + i
if File.directory?(i)
next if File.ftype(i) == 'link'
begin
next if i.scan('/').length >= dir_deep
rescue
next if i.force_encoding('GBK').scan('/').length >= dir_deep
end
next if i.match(/#{exclude}/)
unless Dir.entries(i).include?('.svn')
begin
check(i, ext_type, exclude, dir_deep)
rescue
end
end
elsif File.ftype(i) == 'file'
begin # maybe no ext name
unless i.scan(/\.[^\.]+$/)[0].match(/#{ext_type}/i)
if File.size(i) <= 1024000 && File.size(i) >= 120
if `file \"#{i}\"`.include?('ASCII') || i.scan(/\.[^\.]+$/)[0].match(/doc|docx|xlsx|xls/i)
$result << "." + i
end
end
end
rescue
#unless i.force_encoding('GBK').scan(/\.[^\.]+$/)[0].match(/bmp|png|pdf|vsd|rar|log|dat|bak/i)
if File.size(i) <= 1024000 && File.size(i) >= 120
if `file \"#{i}\"`.include?('ASCII') #|| i.force_encoding('GBK').scan(/\.[^\.]+$/)[0].match(/doc|docx|xlsx|xls/i)
$result << "." + i
end
end
#end
end
end
end
end
def write_file(path,str)
aFile = File.new(path,"w")
aFile.puts str
aFile.close
end
def delete_dir_line(dir)
dir[0] == '/' ? dir[1..-1] : dir
end
def import_config(home_name)
path_in, path_ex, filetype = [], [], []
config = {:deep => 8, :exclude => path_ex, :filetype => filetype, :include => path_in}
begin
File.open("/local_home/#{home_name}/config.txt",'r').each do |line|
if line.match(/^deep/)
config[:deep] = line.split('=')[-1].to_i if line.split('=')[-1].to_i + 2 >= 1
elsif line.match(/^exclude/)
line.split('=')[-1].split(';').each {|x| path_ex << "/local_home/#{home_name}/" + delete_dir_line(x.chomp) if x.length > 1}
elsif line.match(/^include/)
line.split('=')[-1].split(';').each {|x| path_in << "/local_home/#{home_name}/" + delete_dir_line(x.chomp) if x.length > 1}
elsif line.match(/^filetype/)
line.split('=')[-1].split(';').each {|x| filetype << x.chomp if x.length > 1}
end
end
rescue
config = {:deep => 8, :exclude => path_ex, :filetype => filetype, :include => path_in}
end
path_ex.each { |x| path_ex.delete(x) if path_in.index(x) }
return config
end
# get home user
home_user = `grep $(hostname) /etc/auto.nfs | awk -F \'/local_home/\' \'{print $2}\'`.split.join('|')
`rm -rf #{tar_dir}` if File.directory?(tar_dir)
`ls -1 /local_home`.split.each do |list|
if list.match(/#{home_user}/)
`mkdir -p #{tar_dir + "/" + list}`
tar_list_path = "#{tar_dir + "/" + list}/tar.list"
tar_file_name = "#{tar_dir + "/" + list}/#{DateTime.now.strftime("%Y-%m-%d")}.tar.bz2"
config = import_config(list)
if config[:filetype].length > 0
filetype = config[:filetype].join('|')
else
filetype = "bmp|png|pdf|vsd|rar|log|dat|bak"
end
if config[:exclude].length > 0
exclude = config[:exclude].join('|')
else
exclude = "Code|RTL|INCA.libs"
end
if list.match(/#{home_user}/)
if config[:include].length > 0
config[:include].each do |in_path|
check(in_path, filetype, exclude, config[:deep]) if File.directory?(in_path)
end
else
check("/local_home/" + list, filetype, exclude, config[:deep])
end
end
$result << "." + tar_list_path
# write tar_list to tmp file
write_file(tar_list_path,$result)
# tar file
`cd / && tar -jc -T #{tar_list_path} -f #{tar_file_name}`
# scp file
`scp #{tar_file_name} #{bak_ser + ":/bak/auto_bak/" + list + "/" + File.basename(tar_file_name)}`
$result = []
end
`rm -rf #{tar_dir}` if File.directory?(tar_dir)
end
运行前会加载配置文件 (/local_home/USERNAME/config.txt)
格式如下
include=DIR1;DIR2
exclude=DIR1;DIR2
deep=6
filetype=dat;avi
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。