0

here's my code:

> !#usr/bin/ruby

require 'fileutils'

Dir.chdir "/home/john/Documents"

if (Dir.exist?("Photoshoot") === false) then
    Dir.mkdir "Photoshoot"
    puts "Directory: 'Photoshoot' created"
end

Dir.chdir "/run/user/1000/gvfs"

camdirs = Dir.glob('*')
numcams = camdirs.length
camnum = 0
campath = []

while camnum < numcams do
    campath.push("/run/user/1000/gvfs/#{camdirs[camnum]}/DCIM")
    puts campath[camnum]

    camnum += 1
end

campath.each do |path|
    Dir.chdir (path)
    foldnum = 0
    foldir = Dir.glob('*')
    puts foldir
    Dir.entries("#{path}/#{foldir[foldnum]}").each do |filename|
        filetype = File.extname(filename)
        if filetype == ".JPG"
            FileUtils.mv("#{path}/#{foldir[foldnum]}/#{filename}", "/home/john/Documents/Photoshoot")
        end
        foldnum += 1
    end


end
puts "#{numcams} cameras detected"

I'm just trying to go into some cameras I have connected and extract all the images into a file but its giving me this error. One of the things that's messing me up is that the images are stored in sub-folders under DCIM. When I just use .entries it gives me the folders the images are in as well as the images.

/usr/lib/ruby/2.3.0/fileutils.rb:1387:in `copy': unknown file type: /run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C021%5D/DCIM//IMG_0092.JPG (RuntimeError)
    from /usr/lib/ruby/2.3.0/fileutils.rb:472:in `block in copy_entry'
    from /usr/lib/ruby/2.3.0/fileutils.rb:1498:in `wrap_traverse'
    from /usr/lib/ruby/2.3.0/fileutils.rb:469:in `copy_entry'
    from /usr/lib/ruby/2.3.0/fileutils.rb:530:in `rescue in block in mv'
    from /usr/lib/ruby/2.3.0/fileutils.rb:527:in `block in mv'
    from /usr/lib/ruby/2.3.0/fileutils.rb:1571:in `block in fu_each_src_dest'
    from /usr/lib/ruby/2.3.0/fileutils.rb:1585:in `fu_each_src_dest0'
    from /usr/lib/ruby/2.3.0/fileutils.rb:1569:in `fu_each_src_dest'
    from /usr/lib/ruby/2.3.0/fileutils.rb:517:in `mv'
    from /home/john/Desktop/TestExtract.rb:34:in `block (2 levels) in <main>'
    from /home/john/Desktop/TestExtract.rb:31:in `each'
    from /home/john/Desktop/TestExtract.rb:31:in `block in <main>'
    from /home/john/Desktop/TestExtract.rb:26:in `each'
    from /home/john/Desktop/TestExtract.rb:26:in `<main>'
/run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C022%5D/DCIM
/run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C021%5D/DCIM
/run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C020%5D/DCIM
104___03
105___04
106___05
102___01
[Finished in 0.1s with exit code 1]
[shell_cmd: ruby "/home/john/Desktop/TestExtract.rb"]
[dir: /home/john/Desktop]
[path: /home/john/bin:/home/john/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin]

Any advice? I can't figure out what's wrong.

1 Answers1

0

The reason the path to your files looks strange is because your camera storage has been mounted using FUSE. If you look very closely, you'll see that it is looking for:

/run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C021%5D/DCIM//IMG_0092.JPG

You have two forward slashes before the final filename. Try correcting this on line 34 of your app.

If the problem still manifests then it is possible that the user running the operation in Ruby does not have permission to that filesystem or the manner in which the paths are constructed by FUSE is not compatible with Ruby FileUtils.

You can try to run:

cat /run/user/1000/gvfs/gphoto2:host=%5Busb%3A002%2C021%5D/DCIM/IMG_0092.JPG

as the same user that is running the Ruby process to ensure you have read permission to the filesystem.

anothermh
  • 9,815
  • 3
  • 33
  • 52
  • I took out the extra slash on line 34 but it's still giving me the error. When I run your cat command in the console it tells me "Theres no such file or directory". – John Smith Aug 31 '17 at 18:41
  • That's the problem, then. You're using a filesystem overlay to talk to the camera and those paths aren't usable by standard tools. You could try [converting the values](https://stackoverflow.com/questions/9966053/what-does-5b-and-5d-in-post-requests-stand-for) to their actual string counterparts and see if that lets you access the path, but I'm doubtful it's going to work. – anothermh Sep 08 '17 at 19:34