From: Chuck Remes Date: 2011-09-26T01:22:34+09:00 Subject: FileUtils head-scratcher... In one of my projects I need to move all files and subdirectories in a particular directory up on level. e.g. mv * .. When I wrote this in Ruby using FileUtils, it works the first time but subsequent runs fail and I don't understand why. The error doesn't make sense because the file/directory it is complaining about is always already there. Here's the code: require 'fileutils' def makedir(name) FileUtils.mkdir name unless File.exists?(name) && File.directory?(name) end makedir('dir') Dir.chdir('dir') do makedir('subdir') Dir.chdir('subdir') do 5.times { |i| FileUtils.touch i.to_s } makedir('subsubdir') Dir.chdir('subsubdir') do 5.times { |i| FileUtils.touch i.to_s } end end subdir = Dir.glob("subdir/*") FileUtils.mv subdir, '.', :verbose => true end The first run works. The second run fails. cremes$ ruby a.rb mv subdir/0 subdir/1 subdir/2 subdir/3 subdir/4 subdir/subsubdir . cremes$ ruby a.rb mv subdir/0 subdir/1 subdir/2 subdir/3 subdir/4 subdir/subsubdir . An exception occurred running a.rb File exists - . (Errno::EEXIST) Backtrace: { } in FileUtils.mv at /Volumes/spiff/cremes/dev/ruby/rubinius /lib/18/fileutils.rb:500 { } in FileUtils.fu_each_src_dest at /Volumes/spiff/cremes/dev/ruby/rubinius /lib/18/fileutils.rb:1402 { } in FileUtils.fu_each_src_dest0 at /Volumes/spiff/cremes/dev/ruby/rubinius /lib/18/fileutils.rb:1411 Array#each at kernel/bootstrap/array.rb:66 FileUtils.fu_each_src_dest0 at /Volumes/spiff/cremes/dev/ruby/rubinius /lib/18/fileutils.rb:1409 FileUtils.fu_each_src_dest at /Volumes/spiff/cremes/dev/ruby/rubinius /lib/18/fileutils.rb:1400 FileUtils.mv at /Volumes/spiff/cremes/dev/ruby/rubinius /lib/18/fileutils.rb:495 { } in Object#__script__ at a.rb:19 Dir.chdir at kernel/common/dir.rb:68 Object#__script__ at a.rb:8 Rubinius::CodeLoader#load_script at kernel/delta/codeloader.rb:65 Rubinius::CodeLoader.load_script at kernel/delta/codeloader.rb:107 Rubinius::Loader#script at kernel/loader.rb:618 Rubinius::Loader#main at kernel/loader.rb:772 How do I get this to work *every* time? cr