Estoy tratando de buscar todos los archivos de un tipo determinado (por ejemplo, .pdf) en una carpeta determinada y copiarlos en una carpeta nueva. Lo que necesito hacer es especificar una carpeta raíz y buscar en esa carpeta y todas sus subcarpetas los archivos que coincidan con el tipo dado (.pdf). ¿Alguien puede darme una explicación sobre cómo debo buscar a través de las subcarpetas de la carpeta raíz y sus subcarpetas y demás? Parece que un método recursivo sería el truco aquí, pero no puedo implementar uno correctamente? (Estoy implementando este programa en ruby por cierto).Buscar en una carpeta y en todas sus subcarpetas archivos de cierto tipo
Respuesta
Desea el módulo Find. Find.find
toma una cadena que contiene una ruta, y pasará la ruta principal junto con la ruta de acceso de cada archivo y subdirectorio a un bloque acompañante. Un código de ejemplo:
require 'find'
pdf_file_paths = []
Find.find('path/to/search') do |path|
pdf_file_paths << path if path =~ /.*\.pdf$/
end
que la voluntad de forma recursiva buscar un camino, y almacenar todos los nombres de los archivos que terminan en .pdf en una matriz.
Prueba esto:
Dir.glob("#{folder}/**/*.pdf")
que es el mismo que
Dir["#{folder}/**/*.pdf"]
donde la variable carpeta es la ruta a la carpeta raíz de que deseas buscar.
Como una pequeña mejora a Jergason y de Matt respuesta anterior, aquí es cómo se puede condensar a una sola línea:
pdf_file_paths = Find.find('path/to/search').select { |p| /.*\.pdf$/ =~ p }
Esto utiliza el método Find que el anterior, pero aprovecha el hecho de que el resultado es un enumerable (y como tal podemos usar seleccionar) para obtener una matriz de nuevo con el conjunto de coincidencias
Si la velocidad es una preocupación, prefiera Dir.glob
sobre Find.find
.
Warming up --------------------------------------
Find.find 124.000 i/100ms
Dir.glob 515.000 i/100ms
Calculating -------------------------------------
Find.find 1.242k (± 4.7%) i/s - 6.200k in 5.001398s
Dir.glob 5.249k (± 4.5%) i/s - 26.265k in 5.014632s
Comparison:
Dir.glob: 5248.5 i/s
Find.find: 1242.4 i/s - 4.22x slower
require 'find'
require 'benchmark/ips'
dir = '.'
Benchmark.ips do |x|
x.report 'Find.find' do
Find.find(dir).select { |f| f =~ /\*\.pdf/ }
end
x.report 'Dir.glob' do
Dir.glob("#{dir}/**/*\.pdf")
end
x.compare!
end
Usando ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15]
Gracias por la publicación. Es muy útil para principiantes como yo averiguar qué método debo usar entre 'Dir.glob' vs' Find.find'. – itsh
Buscar debería ser más lento en este caso porque está encontrando con una expresión regular. Dir.glob, por otro lado, no es tan poderoso como una expresión regular, así que espero que sea más rápido. – hirowatari
- 1. Cómo copiar una carpeta y todas sus subcarpetas y archivos en otra carpeta
- 2. Buscar archivos y subcarpetas en Python
- 3. Cómo recopilar todos los archivos en una carpeta y sus subcarpetas que coincidan con una cadena
- 4. Eliminar una carpeta y sus subcarpetas en Objective-C/C
- 5. ¿Cómo copio una carpeta y todas las subcarpetas y archivos en .NET?
- 6. Buscar todos los archivos en una carpeta
- 7. Eliminar carpeta CVS de todas las subcarpetas en windows
- 8. Evento de preconstrucción: Copie la carpeta y sus subcarpetas y archivos en el directorio de compilación usando XCopy
- 9. ¿Cómo controlar una carpeta con todas las subcarpetas y archivos dentro?
- 10. sed beginner: cambiar todas las ocurrencias en una carpeta
- 11. Buscar todas las columnas de un cierto tipo en todas las tablas en una base de datos SQL Server
- 12. enumerar las subcarpetas en una carpeta - Matlab (solo subcarpetas, no archivos)
- 13. crear una carpeta en sd con subcarpetas
- 14. VIM - Comando NerdTree para abrir todas las subcarpetas debajo de una carpeta en NerdTree
- 15. Organizar carpeta src Android en subcarpetas (Eclipse)
- 16. Cuál es la mejor manera de copiar una carpeta y todas las subcarpetas y archivos usando C#
- 17. C# escanear una carpeta y abrir archivos que se crearon después de cierto tiempo
- 18. Contraseña que protege un directorio y todas sus subcarpetas usando .htaccess
- 19. Comprimir una carpeta que contiene subcarpetas
- 20. ¿Buscar existencia de archivos en la carpeta androids assets?
- 21. Tortoise SVN: ¿cómo svn actualizar la carpeta pero NO sus subcarpetas?
- 22. ¿Cómo registrar HttpHandler para todas las subcarpetas en Asp.Net?
- 23. Buscar y copiar archivos
- 24. Buscar todas las cadenas en los archivos de código python
- 25. ¿Cómo se incluye/excluye un cierto tipo de archivos en Subversion?
- 26. Obtengo una lista de todas las carpetas y subcarpetas de Outlook
- 27. Buscar recursivamente un valor en variables globales y sus propiedades
- 28. Obtener archivos en una carpeta
- 29. subcarpetas y archivos de copia NSIS en que se instalen dir
- 30. Windows archivos de copia por lotes de subcarpetas a una carpeta
El enfoque es correcto, pero la aplicación es incorrecto. Necesita ser Dir.glob ('**/*. Pdf') – jergason
Creo que el OP quería recursivo, ¿verdad? – rogerdpack
La respuesta original (rogerdpack) funcionó para mí, pero la de Jergason no, me temo. – Joyce