"Globbing"archivos (con Dir.glob) en Ruby le permite seleccionar solo los archivos que desea, como todos los archivos XML, en un directorio determinado. Aunque Dir.blog es me gusta expresiones regulares, no lo es. Es muy limitado en comparación con RubíLas expresiones regulares y están más estrechamente relacionadas con los comodines de expansión de shell.
Lo contrario de globbing, iterando sobre todos los archivos en un directorio, se puede hacer con Dir.foreach método.
Ejemplo
El siguiente glob coincidirá con todos los archivos que terminan en .rb en el directorio actual. Utiliza un solo comodín, el asterisco. El asterisco coincidirá con cero o más caracteres, por lo que cualquier archivo que termine en .rb coincidirá con este globo, incluido un archivo llamado simplemente .rb, sin nada antes de la extensión del archivo y su período anterior. El método glob devolverá todos los archivos que coincidan con las reglas globales como una matriz, que puede guardarse para su uso posterior o repetirse.
#! / usr / bin / env ruby
Dir.glob ('*. Rb'). Cada do | f |
pone f
final
Comodines y más
Solo hay algunos comodines para aprender:
- * - Match cero o más personajes. Un globo compuesto solo por el asterisco y ningún otro carácter o comodín coincidirá con todos los archivos en el directorio actual. El asterisco generalmente se combina con una extensión de archivo, si no más caracteres para limitar la búsqueda.
- ** - Unir todos los directorios de forma recursiva. Esto se utiliza para descender al árbol de directorios y encontrar todos los archivos en subdirectorios del directorio actual, en lugar de solo archivos en el directorio actual. Este comodín se explora en el código de ejemplo a continuación.
- ? - Unir cualquier personaje. Esto es útil para buscar archivos cuyo nombre esté en un formato particular. Por ejemplo, 5 caracteres y una extensión .xml podrían expresarse como ... xml.
- [Arizona] - Unir cualquier personaje en el conjunto de caracteres. El conjunto puede ser una lista de caracteres o un rango separado con el carácter de guión. Los juegos de caracteres siguen la misma sintaxis y se comportan de la misma manera que los juegos de caracteres en expresiones regulares.
- {a, b} - Hacer coincidir el patrón ao b. Aunque esto parece un cuantificador de expresiones regulares, no lo es. Por ejemplo, en expresión regular, el patrón a {1,2} coincidirá con 1 o 2 caracteres 'a'. En globbing, coincidirá con la cadena a1 o a2. Se pueden anidar otros patrones dentro de esta construcción.
Una cosa a considerar es mayúsculas y minúsculas. Depende del sistema operativo determinar si TEST.txt y Prueba. TXT consulte el mismo archivo. En Linux y otros sistemas, estos son archivos diferentes. En Windows, estos se referirán al mismo archivo.
El sistema operativo también es responsable del orden en que se muestran los resultados. Puede diferir si estás en Windows versus Linux, por ejemplo.
Una última cosa a tener en cuenta es el Dir [cadena global] método de conveniencia Esto es funcionalmente lo mismo que Dir.glob (cadena global) y también es semánticamente correcto (está indexando un directorio, como una matriz). Por esta razón, puede ver Dir [] más a menudo que Dir.glob, pero son lo mismo.
Ejemplos de uso de comodines
El siguiente programa de ejemplo demostrará tantos patrones como sea posible en muchas combinaciones diferentes.
#! / usr / bin / env ruby
# Obtenga todos los archivos .xml
Dir ['*. Xml']
# Obtenga todos los archivos con 5 caracteres y una extensión .jpg
Dir ['... jpg']
# Obtenga todas las imágenes jpg, png y gif
Dir ['*. {Jpg, png, gif}']
# Desciende al árbol de directorios y obtén todas las imágenes jpg
# Nota: esto también archivará imágenes jpg en el directorio actual
Dir ['** / *. Jpg']
# Desciende a todos los directorios comenzando con Uni y encuentra todos
# imágenes jpg.
# Nota: esto solo desciende por un directorio
Dir ['Uni ** / *. Jpg']
# Desciende a todos los directorios que comienzan con Uni y todos
# subdirectorios de directorios que comienzan con Uni y find
# todas las imágenes .jpg
Dir ['Uni ** / ** / *. Jpg']