Tcl - Рекурсивная ходьба и загрузка по FTP - PullRequest
2 голосов
/ 13 октября 2011

Как я могу сделать рекурсивный обход локальной папки, чтобы загрузить все, что у нее внутри, в нужную папку ftp?Вот что у меня есть:

package require ftp

set host **
set user **
set pass **
set ftpdirectory **
set localdirectory **

proc upload {host user pass dir fileList} {
      set handle [::ftp::Open $host $user $pass]

     ftpGoToDir $handle $dir
      # some counters for our feedback string
      set j 1
      set k [llength $fileList]

      foreach i $fileList {
        upload:status "uploading ($j/$k) $i"
        ::ftp::Put $handle $i
        incr j
}

  ::ftp::Close $handle
 }

 #---------------
 # feedback
 #---------------
 proc upload:status {msg} {
  puts $msg
 }

 #---------------
 # go to directory in server
 #---------------

 proc ftpGoToDir {handle path} {
     ::ftp::Cd $handle /
     foreach dir [file split $path] {
     if {![::ftp::Cd $handle $dir]} {
         ::ftp::MkDir $handle $dir
         ::ftp::Cd $handle $dir
     }
     }
 }

proc watchDirChange {dir intv {script {}} {lastMTime {}}} {
      set nowMTime [file mtime $dir]
      if [string eq $lastMTime ""] {
         set lastMTime $nowMTime
      } elseif {$nowMTime != $lastMTime} {
         # synchronous execution, so no other after event may fire in between
         catch {uplevel #0 $script}
         set lastMTime $nowMTime
      }
      after $intv [list watchDirChange $dir $intv $script $lastMTime]
 }

watchDirChange $localdirectory 5000 {
    puts stdout {Directory $localdirectory changed!}
    upload $host $user $pass $ftpdirectory [glob -directory $localdirectory -nocomplain *]
}

 vwait forever

Заранее спасибо:)

1 Ответ

4 голосов
/ 13 октября 2011

Вы уже используете пакет ftp, что означает, что у вас установлен tcllib.Хорошо.Это, в свою очередь, означает, что вы также получили пакет fileutil и можете сделать это:

package require fileutil

# How to do the testing; I'm assuming you only want to upload real files
proc isFile f {
    return [file isfile $f]
}
set filesToUpload [fileutil::find $dirToSearchFrom isFile]

Команда fileutil::find очень похожа на рекурсивную glob за исключением того, что вы указываете фильтр как команду, а не через опции.

Вы можете вместо этого использовать rsync ;это не команда Tcl, но она очень хорошая и минимизирует объем фактически передаваемых данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...