Voglio ottenere tutti i nomi di file da una cartella utilizzando Ruby.Ottieni i nomi di tutti i file da una cartella con Ruby
risposta
Hai anche la possibilità di scelta rapida del
Dir["/path/to/search/*"]
e se si desidera trovare tutti i file Ruby in qualsiasi cartella o sottocartella:
Dir["/path/to/search/**/*.rb"]
Dir.entries(folder)
esempio:
Dir.entries(".")
Fonte: http://ruby-doc.org/core/classes/Dir.html#method-c-entries
Sembra che sta usando SO per documentare le risposte alle domande che ha appena chiesto. Una specie di promemoria, suppongo. Non riesco a vedere molto male in questo: dopo tutto, anche se questo è un po 'incompleto (ad esempio, "Dir # glob" potrebbe essere stato citato, per esempio) non c'è nulla che impedisca a qualcun altro di postare una Risposta davvero buona. "Certo, sono per lo più un" bicchiere mezzo pieno "come un tipo ... –
@ Mike: Nel grande schema delle cose, probabilmente non è un grosso problema. E come dici tu se le domande e le risposte erano buone, potrebbe essere un plus generale per il sito. Ma qui sia la domanda che la risposta sono così minime che non sembrano particolarmente utili. – Telemachus
@Telemachus Uso raramente 'Dir', e ogni volta che ne ho bisogno devo leggere la documentazione. Ho postato la mia domanda e la risposta qui in modo da poterlo trovare più tardi, e forse anche aiutare qualcuno con la stessa domanda. Penso di aver sentito al podcast SO che non c'è nulla di sbagliato in un simile comportamento. Se hai una risposta migliore, per favore pubblicala. Ho pubblicato quello che so, non sono un ninja rubino. Accetto regolarmente le risposte con il maggior numero di voti. –
I seguenti frammenti esattamente mostra il nome dei file all'interno di una directory, sottodirectory saltare e "."
, ".."
cartelle tratteggiate:
Dir.entries("your/folder").select {|f| !File.directory? f}
Può anche fare '... selezionare {| f | File.file? f} 'per significato più chiaro e sintassi più breve. – Automatico
Vedo che Dir.entries non restituisce il percorso completo nel nome del file restituito, quindi questa soluzione non ha funzionato per me. –
@ Cort3z, non funziona per me. – squixy
per ottenere tutti i file (rigorosamente file solo) in modo ricorsivo:
Dir.glob('path/**/*').select{ |e| File.file? e }
(file
File.file?
rifiuterebbe non regolari)
o qualsiasi cosa che non è una directory:
Dir.glob('path/**/*').reject{ |e| File.directory? e }
soluzione alternativa
Utilizzando Find#find
più di un metodo di ricerca di pattern-based come Dir.glob
è effettivamente migliore. Vedi this answer to "One-liner to Recursively List Directories in Ruby?".
Personalmente, ho trovato questo il più utile per il ciclo su file in una cartella, lungimirante sicurezza:
Dir['/etc/path/*'].each do |file_name|
next if File.directory? file_name
end
Questa è una soluzione per trovare i file in una directory:
files = Dir["/work/myfolder/**/*.txt"]
files.each do |file_name|
if !File.directory? file_name
puts file_name
File.open(file_name) do |file|
file.each_line do |line|
if line =~ /banco1/
puts "Found: #{line}"
end
end
end
end
end
Mentre ottenendo tutti i nomi dei file in una directory, questo snippet può essere utilizzato per rifiutare entrambe le directory [.
, ..
] e i file nascosti che iniziano con .
files = Dir.entries("your/folder").reject {|f| File.directory?(f) || f[0].include?('.')}
' Dir.entries' restituisce i nomi di file locali, non i percorsi di file assoluti. D'altra parte, 'File.directory? 'Si aspetta un percorso di file assoluto. Questo codice non funziona come previsto. – Nathan
È strano che il codice non funzioni nel tuo caso. Dato che questo è un codice che ho usato in un'app live che funziona bene. Ricontrollerò il mio codice e posterò qui se manca qualcosa del mio codice di lavoro originale :) – Lahiru
@Nathan Vedi la mia risposta per una spiegazione – nus
def get_path_content(dir)
queue = Queue.new
result = []
queue << dir
until queue.empty?
current = queue.pop
Dir.entries(current).each { |file|
full_name = File.join(current, file)
if not (File.directory? full_name)
result << full_name
elsif file != '.' and file != '..'
queue << full_name
end
}
end
result
end
rendimenti relativi percorsi del file dalla directory e tutte le sottodirectory
Questo funziona per me:
Se non si desidera che i file nascosti [1], utilizzano Dir []:
# With a relative path, Dir[] will return relative paths
# as `[ './myfile', ... ]`
#
Dir[ './*' ].select{ |f| File.file? f }
# Want just the filename?
# as: [ 'myfile', ... ]
#
Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.basename f }
# Turn them into absolute paths?
# [ '/path/to/myfile', ... ]
#
Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.absolute_path f }
# With an absolute path, Dir[] will return absolute paths:
# as: [ '/home/../home/test/myfile', ... ]
#
Dir[ '/home/../home/test/*' ].select{ |f| File.file? f }
# Need the paths to be canonical?
# as: [ '/home/test/myfile', ... ]
#
Dir[ '/home/../home/test/*' ].select{ |f| File.file? f }.map{ |f| File.expand_path f }
Ora, Dir.entries tornerà file nascosti, e che non è necessario l'aster jolly ix (è possibile semplicemente passare la variabile con il nome della directory), ma restituirà direttamente il basename, quindi le funzioni File.xxx non funzioneranno.
# In the current working dir:
#
Dir.entries('.').select{ |f| File.file? f }
# In another directory, relative or otherwise, you need to transform the path
# so it is either absolute, or relative to the current working dir to call File.xxx functions:
#
home = "/home/test"
Dir.entries(home).select{ |f| File.file? File.join(home, f) }
[1] .dotfile
su UNIX, non so su Windows
Se si vuole ottenere un array di nomi di file compresi i collegamenti simbolici, utilizzare
Dir.new('/path/to/dir').entries.reject { |f| File.directory? f }
o addirittura
Dir.new('/path/to/dir').reject { |f| File.directory? f }
e se si vuole andare senza collegamenti simbolici, utilizzare
Dir.new('/path/to/dir').select { |f| File.file? f }
Come mostrato in altre risposte, utilizzare Dir.glob('/path/to/dir/**/*')
invece di Dir.new('/path/to/dir')
se si desidera ottenere tutti i file in modo ricorsivo.
O semplicemente usa '*. *' –
Dir.new('/home/user/foldername').each { |file| puts file }
Questo è ciò che funziona per me:
Dir.entries(dir).select { |f| File.file?(File.join(dir, f)) }
Dir.entries
restituisce un array di stringhe. Quindi, dobbiamo fornire un percorso completo del file a File.file?
, a meno che lo dir
sia uguale alla nostra attuale directory di lavoro. Ecco perché questo File.join()
.
Si consiglia inoltre di utilizzare Rake::FileList
(purché si disponga di rake
dipendenza):
FileList.new('lib/*') do |file|
p file
end
Secondo l'API:
filelists sono pigri. Quando viene fornito un elenco di pattern glob per i possibili file da includere nell'elenco dei file, anziché cercare le strutture del file per trovare i file, un FileList mantiene il modello per l'ultimo utilizzo di .
- 1. Apri tutti i file in una cartella
- 2. Trova tutti i file in una cartella
- 3. AngularJS - Come elencare i nomi file da una determinata cartella?
- 4. Come ottenere tutti i nomi di file da una cartella utilizzando C#
- 5. Forza Elimina tutti i file da una cartella
- 6. Ottieni tutti i file da VSS per una data specifica?
- 7. Ottieni i nomi e i valori degli attributi da ElementTree
- 8. Rinomina tutti i file nella cartella con numeri crescenti
- 9. Ottieni tutti i nomi di tabella in un'app di Django
- 10. Javascript - Recupera i nomi dei file in una cartella
- 11. Elimina cartella e tutti i file/sottodirectory
- 12. Ottieni l'elenco dei nomi di file nella cartella con Javascript
- 13. Ottieni i nomi delle colonne
- 14. Come cancellare tutti i contenuti di una cartella con Ruby-Rails?
- 15. Leggi i nomi dei file da una directory
- 16. sposta tutti i file in una cartella in un altro?
- 17. Leggi tutti i file in una cartella nidificata in Spark
- 18. macro - aprire tutti i file in una cartella
- 19. PHP: Ottieni l'elenco di tutti i nomi di file contenuti nella directory delle immagini
- 20. Come rimuovere tutti i file con estensione specifica nella cartella?
- 21. Shellscript che scorre attraverso tutti i file in una cartella
- 22. UglifyJS - converti tutti i file .js in una cartella
- 23. awk, sed: un comando di linea per rimuovere spazi da tutti i nomi di file in una determinata cartella?
- 24. Cancellare una cartella e tutti i suoi contenuti con Qt?
- 25. Typescript 1.8 modules: importa tutti i file dalla cartella
- 26. Come elencare tutti i file in una cartella S3 usando Nebbia in Ruby
- 27. sublime: salva tutti i file aperti/caricati con nomi?
- 28. JQuery - richiama tutti i nomi di file dentro input = 'file'
- 29. Ottenere tutti i file nella cartella di applicazione UWP
- 30. makecab - crea un file cab da tutti i file in una cartella
Oppure puoi fare lo stesso con Dir :: glob() –
Grazie mille, sto usando Dir [] proprio adesso. :) –
Inoltre, usare './...' piuttosto che '~ /' –