Bagaimana cara saya menulis loop di ruby sehingga saya dapat menjalankan blok kode pada setiap file?
Saya baru untuk ruby, dan saya telah menyimpulkan bahwa cara untuk melakukan ini adalah melakukan setiap loop.
File ruby akan dieksekusi dari direktori yang berbeda dari direktori yang ingin saya loop.
Saya sudah mencoba Dir.foreach
dan saya tidak bisa membuatnya bekerja.
ruby
directory
filesystems
Andrew
sumber
sumber
Dir.foreach
berfungsi untuk beralih pada isi direktori, jadi sesuatu yang lain sedang terjadi.do_something_with(entry) if File.file?(entry)
'img/*.{jpg,png,gif,jpeg}'
untuk mengambil banyak ekstensi.Jawaban:
Seperti yang orang lain katakan,
Dir::foreach
adalah pilihan yang bagus di sini. Namun, perhatikan bahwaDir::foreach
danDir::entries
akan selalu menyertakan.
dan..
(direktori saat ini dan orang tua). Anda umumnya tidak ingin mengerjakannya, sehingga Anda dapat menggunakanDir::each_child
atauDir::children
(seperti yang disarankan oleh ma11hew28 ) atau melakukan sesuatu seperti ini:Dir::foreach
danDir::entries
(sertaDir::each_child
danDir::children
) juga menyertakan file & direktori tersembunyi. Seringkali ini yang Anda inginkan, tetapi jika tidak, Anda perlu melakukan sesuatu untuk melompati mereka.Atau, Anda mungkin ingin melihat
Dir::glob
yang menyediakan pencocokan wildcard sederhana:sumber
Dir.foreach
jika direktori berisi sejumlah besar file!next if File.directory? item
.
atau..
karena orang hampir selalu ingin mengabaikan keduanya.Dir.foreach
iterates daripada membangun array (berpotensi besar) di depan (yangDir.glob
tidak). Jadi, jika direktori sangat besar, itu dapat membuat perbedaan kinerja. Dalam keadaan normal Anda tidak akan menyadarinya, tetapi dalam kondisi stres, itu bisa sangat berarti.Ini adalah metode favorit saya agar mudah dibaca:
Dan Anda bahkan dapat memperluas ini untuk bekerja pada semua file di subdirektori:
sumber
Dir juga memiliki sintaks yang lebih pendek untuk mendapatkan array dari semua file dari direktori:
sumber
fname
iterasi?sumber
Pustaka find dirancang untuk tugas ini secara khusus: https://ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html
Ini adalah perpustakaan ruby standar, jadi itu harus tersedia
sumber
File.find
berjalan secara rekursif sejauh mungkin, mulai dari jalan apa pun yang Anda berikan. Saya tidak yakin itu yang diinginkan OP.*.rb
kefind()
Saya suka yang ini, yang belum disebutkan di atas.
Keuntungannya adalah Anda mendapatkan objek Pathname alih-alih string, yang dapat Anda lakukan dengan hal-hal yang bermanfaat dan melintasi lebih jauh.
sumber
sumber
Dir.foreach
mengulang sementaraDir.entries
membangun seluruh array sekaligus. Jadi, jika direktori tersebut sangat besar, itu bukan memori hit. (Biasanya bukan masalah besar, mungkin, tapi tetap saja ...)Untuk melewati
.
&..
, Anda dapat menggunakanDir::each_child
.Dir::children
mengembalikan array nama file.sumber