Forum: Ruby createing directories and moving files into it

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
5eec2be5ef6bb4989bf869f27736dd39?d=identicon&s=25 Bee Tard (btard)
on 2008-10-28 18:53
I have an undetermined list of directories.

I am trying to loop through them all and in each one I want to make a
directory called 'images'. when i do this, I want o move all the imagges
in that folder into it.

so i have a tree like this:

some-dir
\_abc
 - img00971273.jpg
 - img21234235.jpg
 - img12345623.jpg
\_123
 - img99554361.jpg
 - img21234235.jpg
 - img53840534.jpg
\_xyz
 - img00930443.jpg
 - img12364235.jpg
 - img09982623.jpg
\_890
 - img00923871.jpg
 - img21292835.jpg
 - img08836823.jpg

I would like to create


some-dir
\_abc
 \__images
   - img00971273.jpg
   - img21234235.jpg
   - img12345623.jpg

And so on and so forth.

Hope this illustration makes sense. I have tried to create a loop and go
through each directory and use system() to 'mkdir images' and mv *.jpg
/images

no luck as yet. really starting to like some of Ruby's fileutils. just
wish i could get moving with some of these tasks :)

All help greatly appreciated. I'll buy you a beer at lunch.
D0338c0de4cb3c5c17300396159933d1?d=identicon&s=25 Axel Etzold (Guest)
on 2008-10-28 21:41
(Received via mailing list)
-------- Original-Nachricht --------
> Datum: Wed, 29 Oct 2008 02:53:09 +0900
> Von: Bee Tard <scappa@gmail.com>
> An: ruby-talk@ruby-lang.org
> Betreff: createing directories and moving files into it

>  - img00971273.jpg
> \_890
>    - img00971273.jpg
> wish i could get moving with some of these tasks :)
>
> All help greatly appreciated. I'll buy you a beer at lunch.
> --
> Posted via http://www.ruby-forum.com/.


Hi ---

you can create a directory, if it doesn't yet exist, using fileutils:

irb(main):001:0> require "fileutils"
=> true
irb(main):002:0> FileUtils.mkdir_p "temp5"
=> "temp5"

If you do it again, that doesn't matter.
For moving files, I like the rio gem:

http://rio.rubyforge.org/


require "rubygems"
require "rio"

Iterate over the .rb files in a directory and its subdirectories.

 rio('adir').all.files('*.rb') { |entrio|

   # do some checks on entrio.to_s to classify things

  if /\.jpg$/.match(entrio.to_s)
    p "it's an image
  end

 }

Do  also check that you have writing permissions on the directory you
want to write to.

Best regards,

Axel
5eec2be5ef6bb4989bf869f27736dd39?d=identicon&s=25 Bee Tard (btard)
on 2008-10-29 00:34
Axel Etzold wrote:
> you can create a directory, if it doesn't yet exist, using fileutils:
>
> irb(main):001:0> require "fileutils"
> => true
> irb(main):002:0> FileUtils.mkdir_p "temp5"
> => "temp5"
>
> If you do it again, that doesn't matter.
> For moving files, I like the rio gem:
>
> http://rio.rubyforge.org/
>
> require "rubygems"
> require "rio"
>
> Iterate over the .rb files in a directory and its subdirectories.
>
>  rio('adir').all.files('*.rb') { |entrio|
>
>    # do some checks on entrio.to_s to classify things
>
>   if /\.jpg$/.match(entrio.to_s)
>     p "it's an image
>   end
>
>  }
>
> Do  also check that you have writing permissions on the directory you
> want to write to.
>

I did it this way:

for I in *; do mkdir ${I}/myFolder; mv ${I}/* ${I}/myFolder; done

was wondering forever about a ruby way. thanks for the help.
5eec2be5ef6bb4989bf869f27736dd39?d=identicon&s=25 Bee Tard (btard)
on 2008-10-29 00:35
> I did it this way:
>
> for I in *; do mkdir ${I}/myFolder; mv ${I}/* ${I}/myFolder; done
>
> was wondering forever about a ruby way. thanks for the help.

(in mac os terminal)
6087a044557d6b59ab52e7dd20f94da8?d=identicon&s=25 Peña, Botp (Guest)
on 2008-10-29 03:01
(Received via mailing list)
From: Bee Tard [mailto:scappa@gmail.com]
# I did it this way:
# for I in *; do mkdir ${I}/myFolder; mv ${I}/* ${I}/myFolder; done

you can do that too

system "for I in *; do mkdir ${I}/myFolder; mv ${I}/* ${I}/myFolder;
done"

i'm joking of course ;)

that is fine if you have only folders/directory (ie no regular files) in
your current dir, and your folders contain just images.

in a full-fledged language, your checking is flexible, and your code is
portable. plus you get the power of ruby.

anyway, try eg,

<code>
require 'fileutils'
Dir.glob("tempf/*").select{|x| FileTest.directory?(x)}.each{|dir|
  dest_folder = File.join(dir,"images")
  srce_files  = Dir.glob(File.join(dir,"*.jpg"))
  Dir.mkdir dest_folder
  FileUtils.mv srce_files, dest_folder
}
</code>

note, tempf is just my sample test folder to test the code above.
F8f9bc9a19050d3e4849fe54950eda41?d=identicon&s=25 rio4ruby (Guest)
on 2008-11-09 17:10
(Received via mailing list)
On Oct 28, 1:40 pm, Axel Etzold <AEtz...@gmx.de> wrote:
> > I am trying to loop through them all and in each one I want to make a
> > \_123
> >  - img08836823.jpg
> > And so on and so forth.
> > Posted viahttp://www.ruby-forum.com/.
> If you do it again, that doesn't matter.
>
> Best regards,
>
> Axel
> --
> Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen!
> Ideal für Modem und ISDN:http://www.gmx.net/de/go/smartsurfer

Using Rio's rename-mode:

require 'rio'

# This will work if the only images under 'some-dir' are
# as stated in the problem

rio('some-dir').rename.all.files('*.jpg') do |ifile|
  ifile.dirname = rio(ifile.dirname,'images').mkdir
end

# This is little more robust

rio('some-dir').dirs do |d|
  d.rename.files('*.jpg') do |ifile|
    ifile.dirname = rio(ifile.dirname,'images').mkdir
  end
end
This topic is locked and can not be replied to.