Kiedy używasz rozwijania nawiasów?

Rozumiem, czym jest rozwijanie nawiasów klamrowych , ale nie wiem, jak najlepiej użyj go.

Kiedy go używasz?
Jeśli masz własną wskazówkę, podaj kilka wygodnych i niezwykłych przykładów.

Odpowiedź

Rozwijanie nawiasów jest bardzo przydatne, jeśli masz długie nazwy ścieżek. Używam go jako szybkiego sposobu na tworzenie kopii zapasowej pliku :

cp /a/really/long/path/to/some/file.txt{,.bak} 

skopiuje /a/really/long/path/to/some/file.txt do /a/really/long/path/to/some/file.txt.bak

Możesz go również użyć w sekwencji . Kiedyś to zrobiłem, pobierz wiele stron z sieci:

wget http://domain.com/book/page{1..5}.html 

lub

for i in {1..100} do #do something 100 times done 

Komentarze

  • Można to również wykorzystać do powielania argumentów. Załóżmy, że masz program, który wymaga ' -f ' argument dla każdego plik do operacji. zamiast robić program -f file1 -f file2 -f file3, możesz zrobić program "-f file"{1..3}
  • Szkoda. Właśnie to odkryłem, ale robię kopię zapasową na bardzo długich ścieżkach przez lata, nie wiedząc o tym. Dzięki.
  • @Patrick: To się nie udaje, ponieważ program otrzymuje trzy słowa: "-f file1" "-f file2" "-f file3", zamiast 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Używanie rozszerzenia do użycia w pętli for jest trochę bezcelowe, ponieważ możesz pisać for ((i=1; i<=100; i++)) i jest bardziej wydajne.

Odpowiedź

Rozwijanie nawiasów jest bardzo przydatne podczas tworzenia dużych struktur katalogów:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2} 

To da ci

find dir1 -type d dir1 dir1/subdir1 dir1/subdir1/subsubdir1 dir1/subdir1/subsubdir2 dir1/subdir2 dir1/subdir2/subsubdir1 dir1/subdir2/subsubdir2 

Możesz nawet pójść o krok dalej i umieścić rozwijanie nawiasów w rozwijanie nawiasów:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}} 

Dzięki temu uzyskasz taką samą strukturę katalogów jak w powyższym przykładzie.

Komentarze

  • Zagnieżdżanie jest przyjemne, ale przykład zagnieżdżenia (mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) nie ' nie służy właściwie żadnemu celowi. Mogłeś po prostu zrobić to: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
  • @iconoclast, ma to sens, jeśli interpretujesz subdir1 i subdir2 w sensie nieliteralnym. Zamień subdir1 na cat i subdir2 na dog na przykład.
  • @ephsmith: jeśli interpretujesz ” subdir1 ” jako zastępujący ” cat ” i ” subdir2 ” dla ” dog „, to przykład zagnieżdżenia kończy się niepowodzeniem, ponieważ używa podkatalogu {1,2} i nie ma ciągu, który można zastąpić ” subdir ” z tym spowoduje, że subdir {1,2} return {cat, dog}.

Odpowiedź

Używam jej, gdy chcę ograniczyć pisanie:

geany /path/to/file1 /path/to/file2 # versus geany /path/to/file{1,2} 

Inny przykład:

wajig install libpam0g-dev libiw-dev libdb-dev # versus wajig install lib{pam0g,iw,db}-dev 

Odpowiedź

Używam go do porównania rzeczywistych testuj wyjście do żądanego wyjścia testowego podczas programowania. Jeśli test nr 41 nie powiedzie się, łatwo jest zobaczyć, jaka jest różnica między wynikiem testu (w pliku tests.output / 041) a żądanym wyjściem (w pliku tests.out / 041):

$ diff tests.{out,output}/041 

Odpowiedź

Oto niektóre częste przypadki:

Zmiana nazwy:

mv myText.{txt,tex} 

lub

mv myText.tex{,.old} 

lub

cp myText.tex{,.backup} 

(Chociaż użycie kontroli wersji dla ostatnich dwóch zadań jest mniej kłopotliwe.)

Do porównania (już wspomniano):

diff path{1,2}/a.txt 

Odpowiedź

Jest tu kilka świetnych odpowiedzi, ale żadna z nich nie wspomina, kiedy nie , aby używać rozwijania nawiasów. Podobnie jak inne osoby odpowiadające, często używam rozwijania nawiasów w wierszu poleceń. Używam go również w moich aliasach i funkcjach, ponieważ mogę spodziewać się inteligentnej powłoki.

Nie używam go w moich skryptach powłoki (chyba że jest jakiś inny powód, dla którego skrypty powinno być bash lub zsh, chociaż w takich przypadkach najlepiej jest przejść na „prawdziwy” język skryptowy, taki jak perl lub python ). Rozwijanie nawiasów jest nieprzenośne , ponieważ nie jest w standard powłoki POSIX. Nawet jeśli działa w Twoich /bin/sh shebang ed skryptach powłoki, nie będzie działać w systemach z bardziej uproszczonymi /bin/sh powłoki (np. dash).

W przypadku różnicy jednej cyfry nie potrzebujesz rozwijania nawiasów klamrowych; klasa znaków wystarczy:

Bashism:

diff file{1,2} 

Przenośny:

diff file[12] 

Komentarze

  • Różnica polega na że file{1,2} zawsze rozwija się do file1 file2, podczas gdy file[12] rozwija się tylko do istniejących nazw plików: tj. jeśli file1 istnieje, ale file2 nie ' t, file[12] rozwija się tylko do file1. Rozwinięcie [] jest tak naprawdę ograniczoną wersją ? rozwinięcie (i nazywane są ” rozwinięcia nazw ścieżek „).
  • Prawidłowo, rozwinięcie nawiasów nie jest globbing powłoki (inaczej rozwinięcie nazwy ścieżki). To ' jest dobrym wywołaniem, które nie ma

    Naprawdę nie zostało jeszcze wspomniane: rozwijanie nawiasów jest lepsze w zauważaniu nieoczekiwanie nieobecnych ścieżek. Możesz również rozwinąć glob w nawiasach klamrowych.

Odpowiedź

Po podzieleniu bardzo dużego pliku za pomocą

split -b 100m hugeFile.zip part. 

załóżmy, że jest podzielony na 262 części, innymi słowy part.aa, part.ab, part.acpart.kb

Możesz ponownie połączyć te elementy, zagnieżdżając rozszerzenia nawiasów klamrowych , w ten sposób

cat part.{{a..j}{a..z},k{a..b}} > hugeFile.zip 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *