Loop över en uppsättning filer från Shell

Skallskript är kraftfulla eftersom allt som kan göras från skalet görs i ett skalskript. På samma sätt är funktionalitet som vanligtvis bara visas i skalskript som looping och conditionals rättvist spel, skrivet direkt i skalet. Looping över en uppsättning filer med hjälp av en för loop är ett enkelt exempel.


Om det finns flera gzip-arkiv i en katalog och du vill extrahera dem till separata kataloger, är looping från skalet en lösning. Till exempel finns file1.tar.gzip och file2.tgz och ska extraheras i kataloger file1.tar.gzip.dir respektive file2.tgz.dir. Om du använder ett Bourne-typ skal (sh, ksh, zsh, bash), använd följande kommandon från kommandoraden. (När du har tryckt på enter i slutet av varje rad, kommer skalet att ändra meddelandet till> för att meddela att det fortfarande förväntas mer.):

för fil i * gz
> gör
> mkdir $ file.dir
> (cd $ file.dir; gzip -dc $ file | tar xf -)
> gjort

Omslutningen av cd- och gzip / tar-kommandona inom parentes gör att katalogändringen endast påverkar de gzip / tar-kommandona, inte efterföljande.

Ett annat exempel visar hur man skapar en fil som består av innehållet i ett antal filer (till exempel loggfiler) sorterade efter sitt senaste ändringsdatum. Om du vill skapa en storlogg som är gjord av alla filer i den aktuella katalogen sorterad efter datum, använd följande:

för x i 'ls -tr * .log'
> gör
> katt $ x >> biglog
> gjort

Kommandot ls -tr * .log listar alla filer som slutar i .log i kronologisk ordning. Detta kommando är omsluttet i "special citat", inte de "vanliga enkla citaten" som gör att kommandot ska utföras och dess produktion returneras till skalet för användning som en variabel. Biglog-filen måste vara tom eller raderad innan dessa kommandon körs.