[Errno 18] Invalid cross-device link using os.rename

Discussion in 'Python' started by Scott Whitney, Feb 14, 2005.

  1. oldName=/backup/backups/data/WWW_httpd.conf_backups/20050204.httpd.conf


    os.rename(oldName,newName) gives:

    OSError: [Errno 18] Invalid cross-device link

    mv from the shell works fine.

    This is Python 2.2.3 from RedHat 9.0.

    Any suggestions (other than os.system('mv %s %s')?)
    Scott Whitney, Feb 14, 2005
    1. Advertisements

  2. catch exception and copy if error == errno.EXDEV.

    (this is what "mv" does, of course)

    or use shutil.move:
    Help on function move in module shutil:

    move(src, dst)
    Recursively move a file or directory to another location.

    If the destination is on our current filesystem, then simply use
    rename. Otherwise, copy src to the dst and then remove src.
    A lot more could be done here... A look at a mv.c shows a lot of
    the issues this implementation glosses over.

    Fredrik Lundh, Feb 14, 2005
    1. Advertisements

  3. Scott  Whitney

    Jeff Epler Guest

    mv is a surprisingly complex program, while os.rename is a wrapper
    around rename(2) which is probably documented on your system to return
    EXDEV under these circumstanes.

    os.xxx is generally a fairly thin wrapper around what your OS provides,
    and inherits all the "gotchas". For some activities, os.shutil provides
    something that is between os.xxx and os.system("xxx") in complexity and


    Version: GnuPG v1.2.6 (GNU/Linux)

    -----END PGP SIGNATURE-----
    Jeff Epler, Feb 15, 2005
  4. Scott  Whitney

    JustScott Guest

    Thanks, Jeff. I appreciate the input. I just stuck with os.system('mv
    %s %s'). Seems to work fine.
    JustScott, Feb 16, 2005
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.