民斗です。

私は ftpmirror を次のように変更して使ってます。
全部とはいいませんが、いくつか取り込みません? > 前田さん(かな?)

・引数で指定することで、転送対象のディレクトリまたはファイルを指定できる。
  (一部のディレクトリ、ファイルだけを転送可能)
・ディレクトリを再帰しないオプション -l
・コンフィグレーションファイルは -f オプションで指定する。
・TEXTFILE_EXT に nil を指定した場合は全部バイナリモードで転送する。
・ディレクトリでも IGNORE_FILE_REGEXP にマッチしたら無視する。
・ファイルの日付の比較は ctime ではなく mtime で行う。(ローカルファイル
  の日付を意図的に変更して、転送を制御できるようにするため)
・リモート側にシンボリックリンクがあった時のために、ftp.list 時に -lL フ
  ラグを指定する。(こんなやり方でいいのか一抹の不安が…(^^;)

どんなもんでしょう?
--
民斗 <tommy / valley.ne.jp>


--- /tmp/ftpmirror/ftpmirror	Thu Jan  7 13:41:10 1999
+++ ./ftpmirror	Wed Mar 10 13:29:58 1999
@@ -1,3 +1,3 @@
-#!/usr/bin/ruby
+#!/usr/local/bin/ruby
 
 ## ftpmirror version 1.2.1
@@ -5,4 +5,5 @@
 
 require "ftplib"
+require "getopts"
 
 class FTPMirror
@@ -17,5 +18,5 @@
   end
   
-  def initialize(config_file)
+  def initialize(config_file, not_recursive)
     load(config_file)
     check_config("Config")
@@ -26,6 +27,10 @@
     check_config("Config::LOCAL_DIR")
     if defined? Config::TEXTFILE_EXT
-      @textfile_regexp =
-	Regexp.new("\\.(" + Config::TEXTFILE_EXT.join("|") + ")$")
+      if Config::TEXTFILE_EXT
+	@textfile_regexp =
+	  Regexp.new("\\.(" + Config::TEXTFILE_EXT.join("|") + ")$")
+      else
+	@textfile_regexp = nil
+      end
     else
       @textfile_regexp = /\.(txt|html|shtml)$/
@@ -41,4 +46,5 @@
       @leave_file_regexp = nil
     end
+    @not_recursive = not_recursive
   end
   
@@ -49,5 +55,5 @@
   end
   
-  def start
+  def start(path)
     begin
       @ftp = FTP.new
@@ -59,5 +65,11 @@
 	@ftp.chdir(Config::REMOTE_DIR)
 	Dir.chdir(File.expand_path(Config::LOCAL_DIR))
-	updatedir(".")
+	if path.empty?
+	  update(".")
+	else
+	  path.each do |p|
+	    update(p)
+	  end
+	end
       ensure
 	@ftp.quit
@@ -68,4 +80,23 @@
   end
   
+  def update(path)
+    if path =~ /^\//
+      $stderr.print "#{path}: assumed .#{path}\n"
+      $stderr.flush
+      path[0,1] = ""
+    end
+    path[0,0] = "./" if path != "."
+    if not FileTest.exist? path
+      $stderr.print "#{path}: not found\n"
+      $stderr.flush
+      return
+    end
+    if FileTest.directory? path
+      updatedir(path)
+    else
+      updatefile(path)
+    end
+  end
+
   def updatedir(directory)
     print directory.sub(/^./, Config::REMOTE_DIR), ":\n"
@@ -77,12 +108,15 @@
       if file != "." && file != ".."
 	if File.ftype(longname) == "directory"
+	  if longname =~ @ignore_file_regexp
+	    next
+	  end
 	  unless remote_dirs.include?(file)
 	    makedir(longname)
 	  end
-	  updatedir(longname)
+	  updatedir(longname) unless @not_recursive
 	else
 	  if not longname =~ @ignore_file_regexp and
 	      (not remote_filetimes.has_key?(file) or
-	       remote_filetimes[file] < File.ctime(longname))
+	       remote_filetimes[file] < File.mtime(longname))
 	    updatefile(longname)
 	  end
@@ -101,5 +135,5 @@
   
   def check_remote_files(directory, dirs, filetimes)
-    @ftp.list(directory) do |line|
+    @ftp.list("-lL "+directory) do |line|
       unless line =~ /^total/
 	if line[0] == ?d
@@ -168,13 +202,13 @@
 end
 
-if ARGV.length == 0
-  config_file = File.expand_path("~/.ftpmirror")
-elsif ARGV[0] == "--version"
+if not getopts("l", "f:~/.ftpmirror", "version")
+  usage()
+end
+
+if $OPT_version
   FTPMirror.print_version
   exit
-else
-  config_file = ARGV.shift
 end
 
-ftpmirror = FTPMirror.new(config_file)
-ftpmirror.start
+ftpmirror = FTPMirror.new(File.expand_path($OPT_f), $OPT_l)
+ftpmirror.start ARGV