Glob gebruiken met mappen

"Globbing" -bestanden (met Dir.glob) in Ruby kunt u alleen de gewenste bestanden selecteren, zoals alle XML-bestanden, in een bepaalde map. Ondanks dat Dir.blog is Leuk vinden reguliere uitdrukkingen, dat is het niet. Het is zeer beperkt in vergelijking met Ruby's reguliere expressies en is nauwer verwant aan wildcards voor shell-expansie.

Het tegenovergestelde van globbing, waarbij alle bestanden in een map worden herhaald, kan met de Dir.foreach methode.

Voorbeeld

De volgende glob komt overeen met alle bestanden die eindigen op .rb in de huidige map. Het gebruikt een enkele jokerteken, de asterisk. De asterisk komt overeen met nul of meer tekens, dus elk bestand eindigt op .rb komt overeen met deze glob, inclusief een eenvoudig genoemd bestand .rb, met niets vóór de bestandsextensie en de voorafgaande periode. De glob-methode retourneert alle bestanden die overeenkomen met de globbing-regels als een array, die kan worden opgeslagen voor later gebruik of wordt herhaald.

 #! / usr / bin / env ruby

 

 Dir.glob ('*. Rb'). Elk doen | f |

 zet f

 einde

Wildcards en meer

Er zijn slechts enkele jokertekens te leren:

  • * - Overeenkomen met nul of meer tekens. Een glob bestaande uit alleen het sterretje en geen andere tekens of jokertekens komt overeen met alle bestanden in de huidige map. De asterisk wordt meestal gecombineerd met een bestandsextensie, zo niet meer tekens om de zoekopdracht te beperken.
  • ** - Match alle mappen recursief. Dit wordt gebruikt om af te dalen in de mappenlijst en alle bestanden in submappen van de huidige map te vinden, in plaats van alleen bestanden in de huidige map. Dit jokerteken wordt onderzocht in de onderstaande voorbeeldcode.
  • ? - Overeenkomen met een willekeurig karakter. Dit is handig voor het vinden van bestanden waarvan de naam in een bepaald formaat is. Bijvoorbeeld, 5 tekens en een .xml-extensie kunnen worden uitgedrukt als ?????.xml.
  • [A-z] - Overeenkomen met elk teken in de tekenset. De set kan een lijst met tekens zijn of een bereik gescheiden door het koppelteken. Tekensets volgen dezelfde syntaxis als en gedragen zich op dezelfde manier als tekensets in reguliere expressies.
  • A, b - Pas patroon a of b aan. Hoewel dit lijkt op een kwantificator voor reguliere expressie, is het dat niet. Bijvoorbeeld, in reguliere expressie, het patroon a 1,2 komt overeen met 1 of 2 'a' tekens. Bij bolling komt het overeen met de tekenreeks a1 of a2. Andere patronen kunnen in dit construct worden genest.

Een ding om te overwegen is hoofdlettergevoeligheid. Het is aan het besturingssysteem om te bepalen of test.txt en test.txt verwijzen naar hetzelfde bestand. Op Linux en andere systemen zijn dit verschillende bestanden. In Windows verwijzen deze naar hetzelfde bestand.

Het besturingssysteem is ook verantwoordelijk voor de volgorde waarin de resultaten worden weergegeven. Het kan verschillen als u bijvoorbeeld Windows versus Linux gebruikt.

Een laatste ding om op te merken is het Dir [globstring] gemaksmethode. Dit is functioneel hetzelfde als Dir.glob (globstring) en is ook semantisch correct (u indexeert een map, net als een array). Om deze reden kunt u zien Dir [] vaker dan Dir.glob, maar ze zijn hetzelfde.

Voorbeelden met jokertekens

Het volgende voorbeeldprogramma zal zoveel mogelijk patronen laten zien in veel verschillende combinaties.

 #! / usr / bin / env ruby

 

 # Download alle .xml-bestanden

 Dir [ '*. Xml']

 

 # Krijg alle bestanden met 5 karakters en een .jpg extensie

 Dir [ '?????. Jpg']

 

 # Krijg alle jpg-, png- en gif-afbeeldingen

 Dir [ '*. Jpg, png, gif']

 

 # Daal af in de mapstructuur en krijg alle jpg-afbeeldingen

 # Opmerking: hiermee worden ook jpg-afbeeldingen in de huidige map opgeslagen

 Dir [ '** / *. Jpg']

 

 # Daal af in alle mappen beginnend met Uni en vind alles

 # jpg afbeeldingen.

 # Opmerking: dit daalt slechts één map af

 Dir [ 'Uni ** / *. Jpg']

 

 # Daal af in alle mappen die beginnen met Uni en alle

 # submappen van mappen die beginnen met Uni en zoeken

 # alle .jpg-afbeeldingen

 Dir [ 'Uni ** / ** / *. Jpg']