All I want to do is move a directory :(

Discussion in 'Ruby' started by trans. (T. Onoma), Dec 22, 2004.

  1. Very frustrated. I have just spent well over an hour trying to do the simplest
    of all things: move a directory. Of course, I want to do it in Ruby but this
    doesn't work:

    FileUtils.mv( @dir, ".trash/" )

    Could someone please show me why am I apparently so stupid.

    Thanks,
    T.
    trans. (T. Onoma), Dec 22, 2004
    #1
    1. Advertising

  2. On Wednesday 22 December 2004 02:14 pm, you wrote:
    | -----BEGIN PGP SIGNED MESSAGE-----
    | Hash: SHA1
    |
    | trans. (T. Onoma) wrote:
    | > FileUtils.mv( @dir, ".trash/" )
    | >
    | > Could someone please show me why am I apparently so stupid.
    |
    | I don't think it's smart enough to make subdir for you. Try:
    | FileUtils.mv(@dir, File.join('.trash', File.basename(@dir)))

    Thanks. That almost works. But the oddest thing happens. If @dir already
    exists, it moves it to @dir/@dir. If @dir/@dir already exists it bombs. I
    can't figure out why and am starting to think its a bug with #mv.

    T.
    trans. (T. Onoma), Dec 22, 2004
    #2
    1. Advertising

  3. trans. (T. Onoma) wrote:
    > Very frustrated. I have just spent well over an hour trying to do the simplest
    > of all things: move a directory. Of course, I want to do it in Ruby but this
    > doesn't work:
    >
    > FileUtils.mv( @dir, ".trash/" )
    >
    > Could someone please show me why am I apparently so stupid.
    >
    > Thanks,
    > T.
    >
    >
    >
    >
    >
    >


    What excactly are you experiencing? On what platform? On my Linux box
    with Ruby 1.6.8 when I do

    $ mkdir aaa
    $ mkdir .trash

    $ irb -r fileutils
    irb(main):001:0> FileUtils.mv "aaa", ".trash/"

    it works just fine. The only thing is that if ".trash/aaa" already
    exists, I get an exception:

    Errno::EISDIR: Is a directory - ".trash/aaa"
    from /usr/local/lib/ruby/site_ruby/1.6/fileutils.rb:396:in `open'
    from /usr/local/lib/ruby/site_ruby/1.6/fileutils.rb:396:in
    `copy_file'
    from /usr/local/lib/ruby/site_ruby/1.6/fileutils.rb:395:in `open'
    from /usr/local/lib/ruby/site_ruby/1.6/fileutils.rb:395:in
    `copy_file'
    from /usr/local/lib/ruby/site_ruby/1.6/fileutils.rb:445:in `mv'
    from /usr/local/lib/ruby/site_ruby/1.6/fileutils.rb:432:in
    `fu_each_src_dest'
    from /usr/local/lib/ruby/site_ruby/1.6/fileutils.rb:432:in `mv'
    from (irb):1


    Gennady.
    Gennady Bystritksy, Dec 22, 2004
    #3
  4. On Wednesday 22 December 2004 04:25 pm, Gennady Bystritksy wrote:
    | trans. (T. Onoma) wrote:
    | > Very frustrated. I have just spent well over an hour trying to do the
    | > simplest of all things: move a directory. Of course, I want to do it in
    | > Ruby but this doesn't work:
    | >
    | > FileUtils.mv( @dir, ".trash/" )
    | >
    | > Could someone please show me why am I apparently so stupid.
    | >
    | > Thanks,
    | > T.
    |
    | What excactly are you experiencing? On what platform? On my Linux box
    | with Ruby 1.6.8 when I do
    |
    | $ mkdir aaa
    | $ mkdir .trash
    |
    | $ irb -r fileutils
    | irb(main):001:0> FileUtils.mv "aaa", ".trash/"

    Yes. That is one of the problems.

    T.
    trans. (T. Onoma), Dec 22, 2004
    #4
  5. I think the problem may be that the :force option isn't working correctly on
    FilUtils#mv. Isn't that supposed to force the move even if the file/directory
    is already there?

    T.
    trans. (T. Onoma), Dec 23, 2004
    #5
  6. On Wednesday 22 December 2004 07:05 pm, trans. (T. Onoma) wrote:
    | I think the problem may be that the :force option isn't working correctly
    | on FilUtils#mv. Isn't that supposed to force the move even if the
    | file/directory is already there?

    FYI: ruby 1.8.2p2 on Debian Testing
    trans. (T. Onoma), Dec 23, 2004
    #6
  7. trans.  (T. Onoma)

    Minero Aoki Guest

    Hi,

    In mail "Re: All I want to do is move a directory :("
    "trans. (T. Onoma)" <> wrote:

    > I think the problem may be that the :force option isn't working correctly on
    > FilUtils#mv. Isn't that supposed to force the move even if the file/directory
    > is already there?


    It depends on what is the *correct* behavior.
    At least GNU mv does not overwrite directory:

    % find
    Minero Aoki, Dec 23, 2004
    #7
  8. On Wednesday 22 December 2004 08:04 pm, Minero Aoki wrote:
    | It depends on what is the *correct* behavior.
    | At least GNU mv does not overwrite directory:
    |
    | % find
    | .
    | ./trash
    | ./trash/a
    | ./trash/a/test
    | ./a
    | ./a/test
    | ./a/test2
    | % mv a trash
    | mv: cannot overwrite directory `trash/a'
    | % mv -f a trash
    | mv: cannot overwrite directory `trash/a'
    | % find
    | .
    | ./trash
    | ./trash/a
    | ./trash/a/test
    | ./a
    | ./a/test
    | ./a/test2
    | %
    |
    | In my opinion, :force option ensures only that #mv does not
    | raise exception, it does not imply continuing process.
    |

    Hmm. I thought for sure -f overwrote, but indeed you are right. So that means
    one must perform a 'rm -r' first? If so that's really bad, as it is a much
    more dangerous way to have to go about it. If the wrong directory name got in
    there it could spell the end of one's machine :( Is there no way to simply
    (and truly) _force_ a move?

    Thanks,
    T.
    trans. (T. Onoma), Dec 23, 2004
    #8
  9. trans.  (T. Onoma)

    Mark Hubbart Guest

    On Thu, 23 Dec 2004 13:12:17 +0900, trans. (T. Onoma)
    <> wrote:
    > Hmm. I thought for sure -f overwrote, but indeed you are right. So that means
    > one must perform a 'rm -r' first? If so that's really bad, as it is a much
    > more dangerous way to have to go about it. If the wrong directory name got in
    > there it could spell the end of one's machine :( Is there no way to simply
    > (and truly) _force_ a move?


    It's time to roll your own. If you don't have to worry about moving
    across filesystems, a simple File.rename will work:

    irb(main):001:0> Dir.mkdir ".trash"
    => 0
    irb(main):002:0> Dir.mkdir "aaa"
    => 0
    irb(main):003:0> Dir.mkdir ".trash/aaa"
    => 0
    irb(main):004:0> Dir.mkdir "aaa/foo"
    => 0
    irb(main):005:0> File.rename "./aaa", "./.trash/aaa"
    => 0
    irb(main):012:0> puts Dir['.trash/**/*']
    trash/aaa
    trash/aaa/foo

    If you attempt a move across filesystems, rename should raise an
    error. You could catch that error and change strategies to a
    copy/delete sequence. That would be messier, but...

    cheers,
    Mark
    Mark Hubbart, Dec 23, 2004
    #9
  10. On 23.12.2004, at 06:12, trans. (T. Onoma) wrote:
    > If so that's really bad, as it is a much
    > more dangerous way to have to go about it. If the wrong directory name
    > got in
    > there it could spell the end of one's machine :( Is there no way to
    > simply
    > (and truly) _force_ a move?


    How would a forced move differ from rm -rf followed by move?

    -Ilmari
    Ilmari Heikkinen, Dec 23, 2004
    #10
  11. On Thursday 23 December 2004 07:50 am, Ilmari Heikkinen wrote:
    | On 23.12.2004, at 06:12, trans. (T. Onoma) wrote:
    | > If so that's really bad, as it is a much
    | > more dangerous way to have to go about it. If the wrong directory name
    | > got in
    | > there it could spell the end of one's machine :( Is there no way to
    | > simply
    | > (and truly) _force_ a move?
    |
    | How would a forced move differ from rm -rf followed by move?

    Hi --

    When you move something (file or directory) to a directory it goes _into_ that
    directory rather then on top of it.

    T.
    trans. (T. Onoma), Dec 23, 2004
    #11
  12. On Wednesday 22 December 2004 08:04 pm, Minero Aoki wrote:
    |
    | In my opinion, :force option ensures only that #mv does not
    | raise exception, it does not imply continuing process.

    Well, that doesn;t sound like "forcing" to me, but ...

    Sigh, now I'm getting opposite behavior. I tried to create irb session to
    demonstrate the bug I was getting (@dir/@dir) but instead now it seems to be
    overwriting:

    irb(main):001:0> require 'fileutils'
    => true
    irb(main):002:0> puts Dir['**/*']
    a
    test
    a/test.txt
    test/a
    => nil
    irb(main):003:0> FileUtils.mv( "a", "test" )
    => 0
    irb(main):004:0> puts Dir['**/*']
    test
    test/a
    test/a/test.txt

    I traced it to the fact the "a" is empty. If one tries this when "a" is not
    empty it then fails. This doesn't seem to be "UNIX correct" either.

    T.
    trans. (T. Onoma), Dec 23, 2004
    #12
  13. trans.  (T. Onoma)

    Bil Kleb Guest

    Minero Aoki wrote:
    >
    > In my opinion, :force option ensures only that #mv does not
    > raise exception, it does not imply continuing process.


    That sounds counter to the -f option for Un*x's 'mv' command.

    -f, --force do not prompt before overwriting

    Why change the convention to which so many are accustomed?

    Regards,
    --
    Bil Kleb, Hampton, Virginia
    http://fun3d.larc.nasa.gov
    Bil Kleb, Dec 25, 2004
    #13
  14. 'mv' command does not override existing directories if they are not
    empty even with -f option. I cannot try it right now on Linux, but in
    Darwin it even prints out the error message, despite -f option.

    Gennady.

    On Dec 25, 2004, at 12:56 PM, Bil Kleb wrote:

    > Minero Aoki wrote:
    >> In my opinion, :force option ensures only that #mv does not
    >> raise exception, it does not imply continuing process.

    >
    > That sounds counter to the -f option for Un*x's 'mv' command.
    >
    > -f, --force do not prompt before overwriting
    >
    > Why change the convention to which so many are accustomed?
    >
    > Regards,
    > --
    > Bil Kleb, Hampton, Virginia
    > http://fun3d.larc.nasa.gov
    >
    >


    Sincerely,
    Gennady Bystritsky
    Gennady Bystritsky, Dec 25, 2004
    #14
  15. trans.  (T. Onoma)

    Lionel Thiry Guest

    > irb(main):001:0> require 'fileutils'
    > => true
    > irb(main):002:0> puts Dir['**/*']
    > a
    > test
    > a/test.txt
    > test/a
    > => nil
    > irb(main):003:0> FileUtils.mv( "a", "test" )
    > => 0

    Maybe FileUtils.mv( "a", "test" ) and FileUtils( "a", "test/" ) doesn't
    do the same thing?

    Lionel Thiry
    Lionel Thiry, Dec 25, 2004
    #15
  16. trans.  (T. Onoma)

    Minero Aoki Guest

    Hi,

    In mail "Re: All I want to do is move a directory :("
    "trans. (T. Onoma)" <> wrote:

    > Sigh, now I'm getting opposite behavior. I tried to create irb session to
    > demonstrate the bug I was getting (@dir/@dir) but instead now it seems to be
    > overwriting:
    >
    > irb(main):001:0> require 'fileutils'
    > => true
    > irb(main):002:0> puts Dir['**/*']
    > a
    > test
    > a/test.txt
    > test/a
    > => nil
    > irb(main):003:0> FileUtils.mv( "a", "test" )
    > => 0
    > irb(main):004:0> puts Dir['**/*']
    > test
    > test/a
    > test/a/test.txt
    >
    > I traced it to the fact the "a" is empty. If one tries this when "a" is not
    > empty it then fails. This doesn't seem to be "UNIX correct" either.


    This is a bug... fixed now.
    Thank you!


    Regards,
    Minero Aoki
    Minero Aoki, Dec 27, 2004
    #16
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Matt MacDonald
    Replies:
    0
    Views:
    384
    Matt MacDonald
    Jan 30, 2008
  2. mike
    Replies:
    2
    Views:
    473
    Roedy Green
    Mar 15, 2008
  3. Eduardo78
    Replies:
    0
    Views:
    233
    Eduardo78
    Nov 3, 2005
  4. Andrew Tomazos
    Replies:
    2
    Views:
    580
    Nobody
    Dec 12, 2011
  5. Replies:
    4
    Views:
    135
    Ted Zlatanov
    Sep 13, 2006
Loading...

Share This Page