Saya ingin mendapatkan semua nama file dari folder menggunakan Ruby.
358
Anda juga memiliki opsi pintasan
Dir["/path/to/search/*"]
dan jika Anda ingin menemukan semua file Ruby di folder atau sub-folder apa pun:
Dir["/path/to/search/**/*.rb"]
./...
daripada~/
./
berarti direktori saat ini, sedangkan/
adalah titik mount root, dan~/
merupakan direktori home pengguna. Jika Anda memindahkan seluruh proyek ke tempat lain, yang pertama akan berhasil, tetapi dua lainnya mungkin tidak.contoh:
Sumber: http://ruby-doc.org/core/classes/Dir.html#method-c-entries
sumber
Dir#glob
mungkin bisa disebutkan, misalnya) tidak ada yang mencegah orang lain dari memposting Jawaban yang Benar-Benar Baik. 'Tentu saja, saya sebagian besar jenis pria "gelas setengah penuh" ...Dir
jarang menggunakan , dan setiap kali saya membutuhkannya saya harus membaca dokumentasi. Saya telah memposting pertanyaan dan jawaban saya di sini sehingga saya dapat menemukannya nanti, dan mungkin bahkan membantu seseorang dengan pertanyaan yang sama. Saya pikir saya telah mendengar di SO podcast bahwa tidak ada yang salah dengan perilaku seperti itu. Jika Anda memiliki jawaban yang lebih baik, silakan kirim. Saya telah memposting apa yang saya ketahui, saya bukan seorang ninja Ruby. Saya secara teratur menerima jawaban dengan suara terbanyak.Dir[]
atauDir.glob
ketika argumen adalah variabel. Ketikapath = '/tmp'
, membandingkan:Dir.glob("#{path}/*")
vsDir.entries(path)
. Nilai kembali sedikit berbeda (".", ".."), tetapi yang terakhir lebih mudah untuk dilihat sekilas.Cuplikan berikut persis menunjukkan nama file di dalam direktori, melewatkan subdirektori dan
"."
,".."
folder bertitik:sumber
...select {|f| File.file? f}
untuk makna yang lebih jelas dan sintaks yang lebih pendek.Dir.entries("your/folder").select {|f| File.file? f}
!File.directory?
sedang bekerja tetapiFile.file?
tidak..reject {|f| File.directory? f}
tampaknya lebih bersih dari.select{|f| !File.directory? f}
. Oh, dan sekarang saya melihat komentar pertama ... juga bagus.Untuk mendapatkan semua file (hanya file) secara rekursif:
Atau apa pun yang bukan direktori (
File.file?
akan menolak file tidak biasa):Solusi alternatif
Menggunakan
Find#find
lebih dari metode pencarian berbasis pola sepertiDir.glob
sebenarnya lebih baik. Lihat jawaban ini untuk "Satu-liner ke Daftar Direktori secara Rekursif di Ruby?" .sumber
Ini bekerja untuk saya:
Jika Anda tidak ingin file tersembunyi [1], gunakan Dir [] :
Sekarang, Dir.entries akan mengembalikan file tersembunyi, dan Anda tidak perlu wildcard asterix (Anda bisa meneruskan variabel dengan nama direktori), tetapi itu akan mengembalikan nama basenya langsung, sehingga fungsi File.xxx tidak akan berfungsi .
[1]
.dotfile
di unix, saya tidak tahu tentang Windowssumber
Di Ruby 2.5 sekarang Anda dapat menggunakan
Dir.children
. Itu mendapatkan nama file sebagai array kecuali untuk "." dan ".."Contoh:
http://ruby-doc.org/core-2.5.0/Dir.html#method-c-children
sumber
Secara pribadi, saya menemukan ini yang paling berguna untuk pengulangan file dalam folder, melihat ke depan keamanan:
sumber
Ini adalah solusi untuk menemukan file di direktori:
sumber
Saat mendapatkan semua nama file dalam direktori, snippet ini dapat digunakan untuk menolak direktori [
.
,..
] dan file tersembunyi yang dimulai dengan.
sumber
Dir.entries
mengembalikan nama file lokal, bukan path file absolut. Di sisi lain,File.directory?
mengharapkan jalur file absolut. Kode ini tidak berfungsi seperti yang diharapkan.kode ini hanya mengembalikan nama file dengan ekstensi mereka (tanpa jalur global)
sumber
Inilah yang bekerja untuk saya:
Dir.entries
mengembalikan array string. Kemudian, kita harus menyediakan path lengkap fileFile.file?
, kecualidir
sama dengan direktori kerja kita saat ini. Itu sebabnya iniFile.join()
.sumber
Anda mungkin juga ingin menggunakan
Rake::FileList
(asalkan Anda memilikirake
ketergantungan):Menurut API:
https://docs.ruby-lang.org/en/2.1.0/Rake/FileList.html
sumber
Jika Anda ingin mendapatkan array nama file termasuk symlink , gunakan
atau bahkan
dan jika Anda ingin pergi tanpa symlink , gunakan
Seperti yang ditunjukkan dalam jawaban lain, gunakan
Dir.glob('/path/to/dir/**/*')
alih-alihDir.new('/path/to/dir')
jika Anda ingin mendapatkan semua file secara rekursif.sumber
*.*
sumber
Selain saran di utas ini, saya ingin menyebutkan bahwa jika Anda perlu mengembalikan file dot juga (.gitignore, dll), dengan Dir.glob Anda harus menyertakan bendera sebagai berikut:
Dir.glob("/path/to/dir/*", File::FNM_DOTMATCH)
Secara default, Dir.entries termasuk file dot, serta direktori induk saat ini.Bagi siapa pun yang tertarik, saya ingin tahu bagaimana jawaban di sini dibandingkan satu sama lain dalam waktu pelaksanaan, di sini adalah hasil terhadap hierarki yang sangat bersarang. Tiga hasil pertama adalah non-rekursif:
Ini dihasilkan dengan skrip pembandingan berikut:
Perbedaan dalam jumlah file adalah karena
Dir.entries
memasukkan file tersembunyi secara default.Dir.entries
akhirnya mengambil sedikit lebih lama dalam kasus ini karena perlu membangun kembali path absolut file untuk menentukan apakah file adalah direktori, tetapi bahkan tanpa itu masih secara konsisten memakan waktu lebih lama daripada opsi lain dalam kasus rekursif. Ini semua menggunakan ruby 2.5.1 di OSX.sumber
Salah satu cara sederhana adalah:
sumber
mengembalikan jalur relatif file dari direktori dan semua subdirektori
sumber
Dalam konteks IRB, Anda dapat menggunakan yang berikut ini untuk mendapatkan file di direktori saat ini:
Anda dapat membuat ini berfungsi di direktori lain juga:
sumber