shivam
shivam

Reputation: 16506

Move all files with same extension at once in ruby

In terminal i could have used something like:

mv *.ext /some/output/dir/

I want to so the same in ruby. I can use system command for that under backticks (`) or using the system(), but how to achieve the same in ruby way?

I tried:

FileUtils.mv '*.sql', '/some/output/dir/'

This is not working as it looks specifically for a file name '*.sql'

Upvotes: 5

Views: 2027

Answers (3)

Arup Rakshit
Arup Rakshit

Reputation: 118271

I will do using FileUtils::cp, as it copies a file content src to dest. If dest is a directory, copies src to dest/src. If src is a list of files, then dest must be a directory.

FileUtils.cp Dir['*.sql'], '/some/output/dir/'

I wouldn't use ::mv, as if file and dest exist on the different disk partition, the file is copied then the original file is removed.

But if you don't bother with the deletion of the original files, then go with ::mv.

Upvotes: 2

Kostas Rousis
Kostas Rousis

Reputation: 6068

You need to use a Glob, as in:

Dir.glob('*.sql').each do|f|
  # ... your logic here
end

or more succinct:

Dir.glob('*.sql').each {|f| FileUtils.mv(f, 'your/path/here')}

Check the official documentation on FileUtils#mv which has even an example with Glob.

Update: If you want to be sure you don't iterate (although I wouldn't worry about it that much) you can always execute what you consider to be optimized in shell, directly from ruby, e.g.:

`mv *.ext /some/output/dir/`

Upvotes: 1

BroiSatse
BroiSatse

Reputation: 44685

You can do:

FileUtils.mv Dir.glob('*.sql'), '/some/output/dir/'

Upvotes: 11

Related Questions