Jaki jest najszybszy, najbardziej zoptymalizowany, jednowierszowy sposób na uzyskanie tablicy katalogów (z wyłączeniem plików) w Rubim?
A co z dołączaniem plików?
Jaki jest najszybszy, najbardziej zoptymalizowany, jednowierszowy sposób na uzyskanie tablicy katalogów (z wyłączeniem plików) w Rubim?
A co z dołączaniem plików?
Odpowiedzi:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Zamiast tego Dir.glob(foo)
możesz także pisać Dir[foo]
(ale Dir.glob
może również wziąć blok, w takim przypadku zwróci każdą ścieżkę zamiast tworzenia tablicy).
Dir.glob("**/")
chyba że chcesz również linki symboliczne
File::FNM_DOTMATCH
flagi.
Dir.glob("**/*", File::FNM_DOTMATCH)
Uważam, że żadne z rozwiązań tutaj nie dotyczy ukrytych katalogów (np. „.Test”):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
Był dla mnie pomocny
Aby uzyskać listę katalogów, spróbuj
Dir['**/']
Lista plików jest trudniejsza, ponieważ w katalogu Unix znajduje się również plik, więc musisz przetestować typ lub usunąć wpisy z listy zwracanej, która jest rodzicem innych wpisów.
Dir['**/*'].reject {|fn| File.directory?(fn) }
I po prostu lista wszystkich plików i katalogów
Dir['**/*']
Tylko katalogi
`find -type d`.split("\n")
Katalogi i zwykłe pliki
`find -type d -or -type f`.split("\n")`
require "pathname"
def rec_path(path, file= false)
puts path
path.children.collect do |child|
if file and child.file?
child
elsif child.directory?
rec_path(child, file) + [child]
end
end.select { |x| x }.flatten(1)
end
# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
end.select {}.flatten()
część? Ogólnie podoba mi się ta funkcja. Wygląda na to, że utworzy tablicę tablic? Czy byłoby możliwe wykonanie tej elseif
części za pomocą: rec_path(child, file) << child.to_s
tak, aby można było przypisać ją do tablicy i uzyskać tablicę ciągów? Dzięki!
Jak wspomniano w innych odpowiedziach tutaj, możesz użyć Dir.glob
. Należy pamiętać, że foldery mogą zawierać wiele dziwnych znaków, a argumenty glob są wzorcami, więc niektóre znaki mają specjalne znaczenie. W związku z tym wykonanie następujących czynności jest niebezpieczne:
Dir.glob("#{folder}/**/*")
Zamiast tego zrób:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
W PHP lub innych językach, aby uzyskać zawartość katalogu i wszystkich jego podkatalogów, musisz napisać kilka wierszy kodu, ale w Rubim zajmuje to 2 wiersze:
require 'find'
Find.find('./') do |f| p f end
spowoduje to wydrukowanie zawartości bieżącego katalogu i wszystkich jego podkatalogów.
Lub krócej, możesz użyć ’**’
notacji:
p Dir['**/*.*']
Ile wierszy napiszesz w PHP lub Javie, aby uzyskać ten sam wynik?
Chociaż nie jest to rozwiązanie jednokreskowe, myślę, że jest to najlepszy sposób na zrobienie tego za pomocą wywołań ruby.
Najpierw usuń wszystkie pliki rekurencyjnie. Następnie
usuń wszystkie puste katalogi
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
Oto przykład, który łączy dynamiczne wykrywanie katalogu projektu Rails z Dir.glob:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, ale nadal nie widziałem podfolderów i plików w folderze zasobów przezRails.application.config.assets.paths