02 maart 2007

Bash looping

Werken in de terminal heeft z'n voordelen; als je telkens dezelfde handeling moet doen is het handiger hier in 1 keer een commando voor te geven dan telkens in de rondte te klikken. Als je bijvoorbeeld een hoop rar bestanden in 1 keer uit wilt pakken ben je in Gnome alsnog aangewezen op je supersnelle muis-skills, maar in de terminal zou dit in principe met 1 commando opgelost moeten zijn. Unrar is echter zoals wel meer programma's niet bruikbaar met wildcards; ik kan geen *.rar gebruiken om alles in een keer te doen.

Voor deze en andere gelijksoortige situaties biedt de Bash shell echter uitkomst. Je kunt namelijk een for-lus gebruiken om alsnog te doen wat je wilt en zelfs meer. Bekijk het volgende commando maar eens:

$ for fname in *.rar ; do mkdir "${fname:0:${#fname}-4}" cd "${fname:0:${#fname}-4}" unrar e "../$fname" cd .. done

In de eerste zin wordt de for-lus begonnen. Met een for-lus itereer je over een lijst van strings, in dit geval de lijst met rar bestanden. Onder de for-lus geef je vervolgens aan welke commando's je voor elke iteratie uit wilt voeren. In mijn geval maak ik dus per rar bestand een nieuwe directory aan met de naam van het rar bestand, maar wel met het .rar deel eraf geknipt. Vervolgens cd'en we de directory binnen en pakken we het rar bestand erbinnen uit. Daarna gaan we terug naar de begin directory en begint de for-lus weer opnieuw met het volgende rar bestand.

En dit is slechts het topje van de bash ijsberg! Zeker de moeite waard om voortaan voor het uitvoeren van dit soort dingen eens even te checken of het niet sneller kan.

Bronnen: NedDocWiki en The Linux Documentation Project