[ftputil] mirror script + listing files with dot inside

Benjamin Sergeant bsergean at gmail.com
Wed Dec 27 23:12:17 CET 2006


http://www.unixwiz.net/techtips/wget-dotfiles.html
Here they explain how to get the . files : one have to issue the LIST
with -a as a parameter (as for ls)

>>> ftp.retrlines('LIST')
drwxr-xr-x   3 bsergean bsergean      176 Dec 16 03:40 httpd
-rwxr-xr-x   1 bsergean bsergean     4222 Dec 16 03:40 index_flanders.html
-rwxr-xr-x   1 bsergean bsergean      571 Dec 12 20:32 redirection.html
-rw-r--r--   1 bsergean bsergean       69 Dec 12 23:17 svn-commit.2.tmp~
-rw-r--r--   1 bsergean bsergean       69 Dec 12 23:16 svn-commit.tmp
-rw-r--r--   1 bsergean bsergean       69 Dec 12 23:16 svn-commit.tmp~
-rw-r--r--   1 bsergean bsergean      353 Nov  8  2005 vpn.pcf
-rw-r--r--   1 bsergean bsergean      355 Nov  8  2005 vpn.pcf~
'226-Transfer complete.\n226 Down: 0 Files (0mb)  Up: 0 Files (0mb)
10,000,000:1  CR: LEECH'
>>> ftp.retrlines('LIST -a')
drwxr-xr-x   5 bsergean bsergean      728 Dec 26 20:28 .
drwxr-xr-x 115 bsergean bsergean     7992 Dec 27 21:29 ..
-rw-r--r--   1 bsergean bsergean     2471 Nov 17 19:43 .addressbook
-rw-r--r--   1 bsergean bsergean     3100 Dec 12 23:16 .bash_profile
-rw-r--r--   1 bsergean bsergean     3074 Dec 12 20:32 .bash_profile~
-rw-r--r--   1 bsergean bsergean     1287 Dec 16 03:40 .bashrc_adm424
-rw-r--r--   1 bsergean bsergean     4019 Dec 26 20:28 .bashrc_bsergean
-rw-r--r--   1 bsergean bsergean     4019 Dec 26 18:43 .bashrc_bsergean~
lrwxrwxrwx   1 bsergean bsergean       16 Nov 21 19:52 .bashrc_build
-> .bashrc_bsergean
lrwxrwxrwx   1 bsergean bsergean       16 Dec 12 22:36 .bashrc_ttf ->
.bashrc_bsergean
drwxr-xr-x   4 bsergean bsergean      872 Nov 16 21:27 .emacs
-rw-r--r--   1 bsergean bsergean     3229 Dec 12 22:36 .emacs.el
-rw-r--r--   1 bsergean bsergean      613 Nov 17 19:43 .fetchmailrc
-rw-r--r--   1 bsergean bsergean    19847 Nov 17 19:43 .pinerc
-rw-r--r--   1 bsergean bsergean     1706 Dec 16 03:40 .procmailrc
drwxr-xr-x   7 bsergean bsergean      296 Dec 19 01:05 .svn
drwxr-xr-x   3 bsergean bsergean      176 Dec 16 03:40 httpd
-rwxr-xr-x   1 bsergean bsergean     4222 Dec 16 03:40 index_flanders.html
-rwxr-xr-x   1 bsergean bsergean      571 Dec 12 20:32 redirection.html
-rw-r--r--   1 bsergean bsergean       69 Dec 12 23:17 svn-commit.2.tmp~
-rw-r--r--   1 bsergean bsergean       69 Dec 12 23:16 svn-commit.tmp
-rw-r--r--   1 bsergean bsergean       69 Dec 12 23:16 svn-commit.tmp~
-rw-r--r--   1 bsergean bsergean      353 Nov  8  2005 vpn.pcf
-rw-r--r--   1 bsergean bsergean      355 Nov  8  2005 vpn.pcf~
'226-Transfer complete.\n226 Down: 0 Files (0mb)  Up: 0 Files (0mb)
10,000,000:1  CR: LEECH'

By default ftputils doesn't use that.
I tried hard to understand the code but didn't see any DIR or try.
The closest I found was

def _dir(self, path):
in the ftputil function ...



And here is a mirror tool I'm working on:

import logging
logger = logging.getLogger("ftpUploader")
logger.setLevel(logging.DEBUG)
#create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
#create formatter
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s
- %(message)s")
#add formatter to ch
ch.setFormatter(formatter)
#add ch to logger
logger.addHandler(ch)

from ftputil import FTPHost
from glob import glob

class ftpUploader(FTPHost):

    def exists(self, fn):
        ''' Test whether file exist in the current remote dir '''
        return basename(fn) in self.listdir('.')

    def mirror(self, dirname):
        logger.info('mirror (%s)' % dirname)
        remoteDirname = basename(dirname)

        if self.exists(remoteDirname):
            logger.info('Remove dir %s' % remoteDirname)
            self.rmdir(remoteDirname)

        logger.info('Create remote dir %s' % remoteDirname)
        self.mkdir(remoteDirname)

        logger.info('chdir to remote dir %s' % remoteDirname)
        self.chdir(remoteDirname)

        walkdir = dirname
        for path, subdirs, files in os.walk(walkdir):
            print path, subdirs, files

            os.chdir(path)

            if path != walkdir:
                self.chdir(path.split(walkdir + os.sep)[1])

            for d in subdirs:
                if not self.exists(d):
                    self.mkdir(d)

            for f in files:
                self.upload(f, f)


ftp = ftpUploader('localhost', 'bsergean', 'secret')


Hope you can do some stuff with that,
Benjamin.


More information about the ftputil mailing list