How do I use grep with the Shell class

M

Mark Wilson

Hello,

I'm trying to do the following in Ruby using the Shell class:

From the command line, I would write this:

% grep -l PATTERN * | xargs mv --target-directory=DIRECTORY

Because I have many directories I want to visit in turn, I've tried the
following:

directories.each do |d|
shell = Shell.cd(d)
string = String.new
shell.transact do
string = shell.grep("-l", "PATTERN", "*") # => the '*' is not
expanded;
#
grep: *: No such file or directory
end
array = string.split
array.each { |e| File.move(e, "DIRECTORY") }
end

The above does not work. Does anyone have any insight (or alternate
ways to accomplish the same purpose in Ruby)?

Thank you.

Regards,

Mark
 
R

Robert Klemme

Mark Wilson said:
Hello,

I'm trying to do the following in Ruby using the Shell class:

From the command line, I would write this:

% grep -l PATTERN * | xargs mv --target-directory=DIRECTORY

Because I have many directories I want to visit in turn, I've tried the
following:

directories.each do |d|
shell = Shell.cd(d)
string = String.new
shell.transact do
string = shell.grep("-l", "PATTERN", "*") # => the '*' is not
expanded;
#
grep: *: No such file or directory
end
array = string.split
array.each { |e| File.move(e, "DIRECTORY") }
end

The above does not work. Does anyone have any insight (or alternate
ways to accomplish the same purpose in Ruby)?

untested:

def fileGrep(file, pattern)
File.open(file) do |f|
f.each_line do |line|
line.chomp!
# exit as soon as possible
return true if pattern =~ line
end
end

false
end

directories.each do |d|
Dir.foreach( d ) do |file|
File.rename( File.join( d, file ), File.join( TARGET_DIR, file ) ) if
fileGrep( file, /PATTERN/ )
end
end

Regards

robert
 
J

Jason Creighton

Hello,

I'm trying to do the following in Ruby using the Shell class:

From the command line, I would write this:

% grep -l PATTERN * | xargs mv --target-directory=DIRECTORY

Because I have many directories I want to visit in turn, I've tried the
following:

directories.each do |d|
shell = Shell.cd(d)
string = String.new
shell.transact do
string = shell.grep("-l", "PATTERN", "*") # => the '*' is not
expanded;
#
grep: *: No such file or directory
end
array = string.split
array.each { |e| File.move(e, "DIRECTORY") }
end

The above does not work. Does anyone have any insight (or alternate
ways to accomplish the same purpose in Ruby)?

Something like this, perhaps?

directories.each do |d|
Dir["#{d}/*"].each do |filename|
f = File.open(filename)
if f.detect { |line| line =~ /PATTERN/ }
File.rename(filename, File.join("DIRECTORY", File.basename(filename)))
end
f.close()
end
end

Using the command line would probably be easier for a quick job like
this, however. (Unless you really need to do this from within Ruby)

Jason Creighton
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top