I can use Find.find(Pathname.getwd) to get an array of all file paths recursively, but how do I get only the files in the cwd (do not recurse into sub-directories)?
Thank you,
Brad
I can use Find.find(Pathname.getwd) to get an array of all file paths recursively, but how do I get only the files in the cwd (do not recurse into sub-directories)?
Thank you,
Brad
rtilley wrote:
I can use Find.find(Pathname.getwd) to get an array of all file paths
recursively, but how do I get only the files in the cwd (do not
recurse into sub-directories)?
Dir provides several ways to do this:
Try:
Dir["#{Dir.getwd}/*"]
Hope that helps.
James Edward Gray II
On Mar 21, 2006, at 1:18 PM, rtilley wrote:
I can use Find.find(Pathname.getwd) to get an array of all file paths recursively, but how do I get only the files in the cwd (do not recurse into sub-directories)?
rtilley wrote:
I can use Find.find(Pathname.getwd) to get an array of all file paths
recursively, but how do I get only the files in the cwd (do not recurse
into sub-directories)?
Check out Dir (http://ruby-doc.org/core/classes/Dir.html\)
Dir.pwd #=> current directory
Dir['*'] #=> contents of current directory (files and directories)
Cheers
rtilley wrote:
I can use Find.find(Pathname.getwd) to get an array of all file paths
recursively, but how do I get only the files in the cwd (do not recurse
into sub-directories)?Thank you,
Brad
Was just reviewing the docs for Find
(http://ruby-doc.org/stdlib/libdoc/find/rdoc/classes/Find.html\) and
they have a nice example of how to use it. For your case you could
say:
require 'find'
require 'pathname'
require 'pp'
root = Pathname.getwd
pp "Looking in #{root}"
Find.find(root) do |path|
next if path == root #look in the given directory
if FileTest.directory?(path)
Find.prune # but don't look into sub-dir(s).
else
pp path
end
end
cheers
wow!
--- Ursprüngliche Nachricht ---
Von: James Edward Gray II <james@grayproductions.net>
An: ruby-talk@ruby-lang.org (ruby-talk ML)
Betreff: Re: Find.find and files in cwd
Datum: Wed, 22 Mar 2006 04:24:29 +0900On Mar 21, 2006, at 1:18 PM, rtilley wrote:
> I can use Find.find(Pathname.getwd) to get an array of all file
> paths recursively, but how do I get only the files in the cwd (do
> not recurse into sub-directories)?Try:
Dir["#{Dir.getwd}/*"]
Hope that helps.
James Edward Gray II
Nice!
-----Original Message-----
From: James Edward Gray II [mailto:james@grayproductions.net]
Sent: Tuesday, March 21, 2006 2:24 PM
To: ruby-talk ML
Subject: Re: Find.find and files in cwd
On Mar 21, 2006, at 1:18 PM, rtilley wrote:
I can use Find.find(Pathname.getwd) to get an array of all file
paths recursively, but how do I get only the files in the cwd (do
not recurse into sub-directories)?
Try:
Dir["#{Dir.getwd}/*"]
Hope that helps.
James Edward Gray II
James Edward Gray II wrote:
I can use Find.find(Pathname.getwd) to get an array of all file paths recursively, but how do I get only the files in the cwd (do not recurse into sub-directories)?
Try:
Dir["#{Dir.getwd}/*"]
Yes, that helps... thank you. Perhaps I'm using it wrong though. When trying to extract files with File.file? or links with File.link? like this:
Dir["#{Dir.getwd}/*"].each do |path|
if File.file?(path)
puts path
end
end
I get the whole directory listing (files, links, folders, etc.)
On Mar 21, 2006, at 1:18 PM, rtilley wrote:
This seems to have become an obsession! 9^)
After looking at the docs on Pathname
(http://ruby-doc.org/core/classes/Pathname.html), it seems this module
wraps alot of the File related functionality. Thus we can more
concisely say:
require 'pathname'
require 'pp'
Pathname.getwd.children.each{ |f| pp f.to_s if f.file?}
Cheers
rtilley wrote:
James Edward Gray II wrote:
I can use Find.find(Pathname.getwd) to get an array of all file
paths recursively, but how do I get only the files in the cwd (do
not recurse into sub-directories)?Try:
Dir["#{Dir.getwd}/*"]
Yes, that helps... thank you. Perhaps I'm using it wrong though. When
trying to extract files with File.file? or links with File.link? like this:Dir["#{Dir.getwd}/*"].each do |path|
if File.file?(path)
puts path
end
endI get the whole directory listing (files, links, folders, etc.)
To get only normal files try:
Dir["*"].delete_if{ |e| not File.file?( e ) }
To get only directories try:
Dir["*"].delete_if{ |e| not File.directory?( e ) }
To get only links try:
Dir["*"].delete_if{ |e| not File.link?( e ) }
Zach
On Mar 21, 2006, at 1:18 PM, rtilley wrote:
zdennis wrote:
To get only normal files try:
Dir["*"].delete_if{ |e| not File.file?( e ) }To get only directories try:
Dir["*"].delete_if{ |e| not File.directory?( e ) }To get only links try:
Dir["*"].delete_if{ |e| not File.link?( e ) }Zach
The whole thing seems a bit hackish to me and it still leaves links to files and links to folders on my Windows test machine.
I like this:
contents = Dir.entries(Pathname.getwd)
Better than this:
contents = Dir["#{Dir.getwd}/*"]
It makes more sense to me and seems more readable.
I wish that with either approach File.file? would work like this:
Dir.entries(Pathname.getwd).each do |entry|
if File.file?(entry)
puts entry
end
end
Why not:
Dir.entries(Dir.pwd).each do |entry|
unless File.directory?(entry)
puts entry
end
end
Or Dir.entries(Dir.pwd).reject { |entry| File.directory?(entry) }
On Mar 21, 2006, at 4:38 PM, rtilley wrote:
zdennis wrote:
To get only normal files try:
Dir["*"].delete_if{ |e| not File.file?( e ) }
To get only directories try:
Dir["*"].delete_if{ |e| not File.directory?( e ) }
To get only links try:
Dir["*"].delete_if{ |e| not File.link?( e ) }
ZachThe whole thing seems a bit hackish to me and it still leaves links to files and links to folders on my Windows test machine.
I like this:
contents = Dir.entries(Pathname.getwd)Better than this:
contents = Dir["#{Dir.getwd}/*"]It makes more sense to me and seems more readable.
I wish that with either approach File.file? would work like this:
Dir.entries(Pathname.getwd).each do |entry|
if File.file?(entry)
puts entry
end
end
rtilley wrote:
zdennis wrote:
To get only normal files try:
Dir["*"].delete_if{ |e| not File.file?( e ) }To get only directories try:
Dir["*"].delete_if{ |e| not File.directory?( e ) }To get only links try:
Dir["*"].delete_if{ |e| not File.link?( e ) }Zach
The whole thing seems a bit hackish to me and it still leaves links to
files and links to folders on my Windows test machine.I like this:
contents = Dir.entries(Pathname.getwd)Better than this:
contents = Dir["#{Dir.getwd}/*"]It makes more sense to me and seems more readable.
I wish that with either approach File.file? would work like this:
Dir.entries(Pathname.getwd).each do |entry|
if File.file?(entry)
puts entry
end
end
Working with file globs is *not* hackish in my opinion. File globs are a powerful and wonderful thing. See Dir#glob for more
information.
Granted reject is better use then delete_if in this scenario. I like Logan's last solution, although to tidy it up:
Dir.entries( Dir.pwd ).reject{ |f| File.directory?( f ) }
Zach
rtilley schrieb:
Dir.entries(Pathname.getwd).each do |entry|
if File.file?(entry)
puts entry
end
end
Works here with Ruby 1.8.4 (2005-12-24) [i386-mswin32] on Windows 2000. Same output as
Dir[ "*" ].each do |f|
puts f if File.file? f
end
Are you testing this in IRB? If so, remember that each returns the original array, including directories.
Regards,
Pit