Komputery, oprogramowanie, internet i okolice
Blog > Komentarze do wpisu

Bash Tips - Brace expansion

Jak powszechnie wiadomo w Linuksie konsola fajna jest. Gdy już poznamy kilka prostych sztuczek okazuje się, że bardzo wiele czynności w konsoli można wykonać o wiele wygodniej i szybciej, niż gdybyśmy mieli przeklikiwać się przez różne okienka. Dziś o jednej z takich sztuczek, jakie oferuje powłoka bash.

Brace expansion

Mechanizm Brace expansion polega na rozwijaniu wyrażeń znajdujących się w nawiasach klamrowych. Do dyspozycji mamy:

  • Rozwinięcie listy: {element1,element2,elementN}
  • Rozwinięcie sekwencji znaków lub liczb: {START..STOP}
  • Dołączanie przedrostka i/lub przyrostka do rozwijanych elementów: przedrostek{foo,bar}przyrostek
  • Powyższe można łączyć ze sobą

Oto kilka przykładów działania brace expansion:

$ echo {foo,bar,baz}
foo bar baz
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo {10..1}
10 9 8 7 6 5 4 3 2 1
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo {z..a}
z y x w v u t s r q p o n m l k j i h g f e d c b a
$ echo kot_{1..3}
kot_1 kot_2 kot_3
$ echo {biały,czarny}_kot
biały_kot czarny_kot
$ echo foo_{1,2}_bar
foo_1_bar foo_2_bar
$ echo {{a..z},{A..Z}}
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
$ echo {A..C}{0..3}
A0 A1 A2 A3 B0 B1 B2 B3 C0 C1 C2 C3

W bashu 4.0 wprowadzono jeszcze dwa ułatwienie, uzupełnianie o wiodące zera i określenie skoku inkrementacji sekewncji

$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
$ echo {1..10..2}
1 3 5 7 9
$ echo {a..z}
a c e g i k m o q s u w y

Brace expansion w praktyce

Wszystko pięknie, ładnie, rozwija i wypisuje, OK. Ale do czego to się może przydać? Jak niby ma to pomóc w codziennej pracy? Na przykład w sytuacjach takich jak poniżej.

Najczęściej pojawiającym się przykładem jest tworzenie za jednym razem całej struktury katalogów:

$ mkdir -p ~/projekty/nowy-projekt/{trunk,tags,branches}
$ mkdir -p zdjęcia/{rodzina,zwierzaki/{koty,psy}}

Kasowanie wielu plików na raz:

$ rm picture_{1..100}.jpg
$ rm /bardzo/długa/ścieżka/której/nie/chce/nam/się/pisać/{plik1,plik2,plik3}

Wylistowanie tylko plików z wybranymi rozszerzeniami:

$ ls *.{png,jpg,gif}

Pobranie archiwum podzielonego na kilka części:

$ wget http://example.com/download/plik.r0{1..5}

Tworzenie kopii pliku, lub zmiana nazwy:

$ mv ~/.bashrc{,.bak}
$ cp ~/.bashrc{,.bak}

By później sprawdzić jakie dokładnie wprowadziliśmy zmiany:

$ diff ~/.bashrc{.bak,}

Prawda, że proste?

poniedziałek, 26 kwietnia 2010, kosciak1

TrackBack
TrackBack w tym blogu jest moderowany. TrackBack URL do wpisu:
Komentarze
2010/06/27 04:50:47
Czy w bashu 4 ta komenda jest poprawna?
$ echo {a..z} ??

Tam nie powinno być $ echo {a..z..2} ??
Spis Treści
Kanały RSS
Add to Google
Add to Netvibes