I think I solved my problem. I was looking at inotify in order to avoid
having the script have to check the directories on a regular basis. Turns
out that it can report when a file is closed for writing, *and* return the
path and basename of the file.
The only downside is that ruby-inotify doesn't (as far as I can tell) do
recursive checks of the directory, so I'm using Open3 to call inotifywait,
and parsing its output.
Here's my test program:
#!/usr/bin/ruby -w
require 'open3'
require 'ftools'
def inwait(path)
Open3.popen3("inotifywait -m -r #{path}"){ |stdin, stdout, stderr|
while line = stdout.gets
next unless line.include?("CLOSE_WRITE")
yield line
end
}
end
inwait("/tmp") do |line|
path, action, file = line.split
puts "path: \t #{path}"
puts "action: \t #{action}"
puts "file: \t #{file}"
File.move(path+file, "/tmp")
end
Paul
Tomorrow, Paul Archer wrote:
> So, I'm (still) working on some scripts to rename and reorganize my image
> files.
> Right now, I have a script on my laptop that pulls images off the CF card and
> stores them locally. I have another script that rsync's the images to my
> server at home whenever there's a connection available. These scripts don't
> step on each other because they look at the process list for instances of
> rsync.
>
> But I need to write two more scripts that take the image files from an
> incoming directory, rename them, and drop them into a directory for me to
> work on them; then once I've done whatever I'm going to do (cull, keyword,
> etc), then I put them into a directory for archiving. The images are going to
> be pulled from that directory, put in an archive directory, and have the
> immutable extended attribute (xattr) set.
>
> My problem/issue is that I don't want to do anything with a file that is in
> the process of being moved into one of these directories. I have to be sure
> that the file is not still being moved/copied. Now, these directories are all
> on the same filesystem, so it *should* be an atomic change by the filesystem
> (technically a rename of the file from one directory/file name to another).
> But I want to be sure--plus I may be dropping files into the incoming
> directory from elsewhere from time to time. (I plan on going through my
> backlog of old untagged files eventually.)
>
> Can someone suggest an easy (or at least reliable) way to make sure that any
> file I'm about to modify isn't being touched by another program?
>
> Paul
>