使用 Ruby 从文件夹中获取所有文件的名称
我想使用 Ruby 从文件夹中获取所有文件名。
I want to get all file names from a folder using Ruby.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我想使用 Ruby 从文件夹中获取所有文件名。
I want to get all file names from a folder using Ruby.
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(19)
您还可以使用 和 的快捷方式选项:
如果您想查找任何文件夹或子文件夹中的所有 Ruby 文件,
You also have the shortcut option of
and if you want to find all Ruby files in any folder or sub-folder:
示例:
来源:http://ruby-doc.org/core /classes/Dir.html#method-c-entries
example:
Source: http://ruby-doc.org/core/classes/Dir.html#method-c-entries
以下代码片段准确显示了目录内文件的名称,跳过子目录和
"."
,".."
点状文件夹:The following snippets exactly shows the name of the files inside a directory, skipping subdirectories and
"."
,".."
dotted folders:要递归地获取所有文件(严格来说仅限文件):
或者任何不是目录的文件(
File.file?
将拒绝非常规文件):替代解决方案
使用
Find#find
结束像Dir.glob
这样基于模式的查找方法实际上更好。请参阅此答案“单行递归列出目录”在 Ruby 中?”。To get all files (strictly files only) recursively:
Or anything that's not a directory (
File.file?
would reject non-regular files):Alternative Solution
Using
Find#find
over a pattern-based lookup method likeDir.glob
is actually better. See this answer to "One-liner to Recursively List Directories in Ruby?".在 Ruby 2.5 中,您现在可以使用
Dir.children
。它以数组形式获取除“.”之外的文件名。和“..”示例:
http://ruby- doc.org/core-2.5.0/Dir.html#method-c-children
In Ruby 2.5 you can now use
Dir.children
. It gets filenames as an array except for "." and ".."Example:
http://ruby-doc.org/core-2.5.0/Dir.html#method-c-children
这对我有用:
如果您不想要隐藏文件[1],请使用 Dir[]:
现在,Dir.entries 将返回隐藏文件,而您不需要不需要通配符星号(您可以只传递带有目录名称的变量),但它会直接返回基本名称,因此 File.xxx 函数将不起作用。
[1] UNIX 上的
.dotfile
,我不知道 Windows 上的This works for me:
If you don't want hidden files[1], use Dir[]:
Now, Dir.entries will return hidden files, and you don't need the wildcard asterix (you can just pass the variable with the directory name), but it will return the basename directly, so the File.xxx functions won't work.
[1]
.dotfile
on unix, I don't know about Windows此代码仅返回带有扩展名的文件名(没有全局路径)
=> [文件_1.rb、文件_2.html、文件_3.js]
this code returns only filenames with their extension (without a global path)
=> [file_1.rb, file_2.html, file_3.js]
就我个人而言,我发现这对于循环文件夹中的文件最有用,具有前瞻性的安全性:
Personally, I found this the most useful for looping over files in a folder, forward looking safety:
这是在目录中查找文件的解决方案:
This is a solution to find files in a directory:
在获取目录中的所有文件名时,此代码段可用于拒绝目录 [
.
、..
] 和以开头的隐藏文件。
While getting all the file names in a directory, this snippet can be used to reject both directories [
.
,..
] and hidden files which start with a.
这对我有用:
Dir.entries
返回一个字符串数组。然后,我们必须向File.file?
提供文件的完整路径,除非dir
等于我们当前的工作目录。这就是这个File.join()
的原因。This is what works for me:
Dir.entries
returns an array of strings. Then, we have to provide a full path of the file toFile.file?
, unlessdir
is equal to our current working directory. That's why thisFile.join()
.一种简单的方法可能是:
One simple way could be:
您可能还想使用
Rake::FileList
(前提是您有rake
依赖项):根据 API:
https://docs.ruby-lang.org/en/ 2.1.0/Rake/FileList.html
You may also want to use
Rake::FileList
(provided you haverake
dependency):According to the API:
https://docs.ruby-lang.org/en/2.1.0/Rake/FileList.html
除了本线程中的建议之外,我想提一下,如果您还需要返回点文件(.gitignore 等),则使用 Dir.glob 您需要包含一个标志,如下所示:
Dir.glob("/path/to/dir/*", File::FNM_DOTMATCH)
默认情况下,Dir.entries 包括点文件以及当前父目录。
对于任何感兴趣的人,我很好奇这里的答案在执行时间上如何相互比较,这是针对深度嵌套层次结构的结果。前三个结果是非递归的:
这些结果是使用以下基准测试脚本生成的:
文件计数的差异是由于默认情况下包含隐藏文件的
Dir.entries
造成的。在这种情况下,由于需要重建文件的绝对路径来确定文件是否是目录,Dir.entries
最终花费了更长的时间,但即使没有,它仍然比递归情况下的其他选项。这一切都是在 OSX 上使用 ruby 2.5.1。In addition to the suggestions in this thread, I wanted to mention that if you need to return dot files as well (.gitignore, etc), with Dir.glob you would need to include a flag as so:
Dir.glob("/path/to/dir/*", File::FNM_DOTMATCH)
By default, Dir.entries includes dot files, as well as current a parent directories.
For anyone interested, I was curious how the answers here compared to each other in execution time, here was the results against deeply nested hierarchy. The first three results are non-recursive:
These were generated with the following benchmarking script:
The differences in file counts are due to
Dir.entries
including hidden files by default.Dir.entries
ended up taking a bit longer in this case due to needing to rebuild the absolute path of the file to determine if a file was a directory, but even without that it was still taking consistently longer than the other options in the recursive case. This was all using ruby 2.5.1 on OSX.当加载操作目录中的所有文件名时,您可以使用
Dir.glob("*)
这将返回应用程序正在运行的上下文中的所有文件(注意,对于 Rails,这是顶层应用程序的目录)
您可以在此处进行其他匹配和递归搜索 https://ruby-doc.org/core-2.7.1/Dir.html#method-c-glob
When loading all names of files in the operating directory you can use
Dir.glob("*)
This will return all files within the context that the application is running in (Note for Rails this is the top level directory of the application)
You can do additional matching and recursive searching found here https://ruby-doc.org/core-2.7.1/Dir.html#method-c-glob
返回目录和所有子目录中文件的相对路径
returns file's relative paths from directory and all subdirectories
如果您想获取文件名数组包括符号链接,请使用
or Even
,如果您想没有符号链接,请使用
如其他答案所示,请使用
Dir.如果您想获取所有文件,则使用 glob('/path/to/dir/**/*')
而不是Dir.new('/path/to/dir')
递归地。If you want get an array of filenames including symlinks, use
or even
and if you want to go without symlinks, use
As shown in other answers, use
Dir.glob('/path/to/dir/**/*')
instead ofDir.new('/path/to/dir')
if you want to get all the files recursively.如果您创建带有空格的目录:
您不需要转义目录名称,它会自动执行:
if you create directories with spaces:
You don't need to escape the directory names, it will do it automatically: