バックアップスクリプトを作りなおしてみた。
コメントの英語が間違っているのととかは気にしない。
#!/usr/bin/env ruby # coding: utf-8 require 'find' require 'fileutils' line_has_include = [] filebasename_includefiles = [] File.open(ARGV[0], 'r:utf-8') do |f| # if file has line include "\include", array will has the line f.each_line do |line| line_has_include.push(line) if line.include?('\\include') end end line_has_include.each do |line| line =~ /\{(.+)\}/ filebasename_includefiles.push($+) end # get texfile absolute path abs_path = File.expand_path(ARGV[0]) abs_dir, file_basename = File.split(abs_path) # get texfile name without ext file_basename = File.basename(file_basename, '.*') # unless /home/user/Desktop/doc directory exists, make now base_dir = '/home/hikaru/Drive/' FileUtils.mkdir_p(base_dir) unless FileTest.exist?(base_dir) # set backup dir and unless backup_dir exists, make now backup_dir = base_dir + file_basename FileUtils.mkdir_p(backup_dir) unless FileTest.exist?(backup_dir) # make pdf dir for preview pdf put # find include files and copy Find.find(abs_dir) do |f| # abs directory find files filebasename_includefiles.each do |include_base| if f.include?(include_base) f =~ /(\.\/)/ FileUtils.cp(f, backup_dir) if File.extname(f) == '.tex' FileUtils.cp(f, backup_dir) if File.extname(f) == '.aux' end end if f.include?(file_basename) # extname is tex or pdf, copy for backup if File.extname(f) == '.tex' FileUtils.cp(f, backup_dir) elsif File.extname(f) == '.pdf' FileUtils.cp(f, backup_dir) # if extname is aux, move backupdir for backup elsif File.extname(f) == '.aux' FileUtils.move(f, backup_dir) # delete other files elsif File.ftype(f) == 'file' File.delete(f) end end end
簡単に言えば、やっていることは、
- .tex タイプセットするファイルの中身から \include と書かれている行を探す
- include されているファイルの名前を取得
- バックアップディレクトリがなければつくる
- \include ファイルがあれば、 バックアップディレクトリにバックアップをとる
- その他、 タイプセットで生じた .tex, .aux, .pdf はバックアップ
- その他の拡張子のファイルは削除
という感じ。
僕の場合はついでに GoogleDrive で共有させたかったのでバックアップディレクトリはDriveとの同期ディレクトリになっております。
個人的にはかなり満足している。