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
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
isubdir2
w sensie nieliteralnym. Zamieńsubdir1
nacat
isubdir2
nadog
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ę dofile1 file2
, podczas gdyfile[12]
rozwija się tylko do istniejących nazw plików: tj. jeślifile1
istnieje, alefile2
nie ' t,file[12]
rozwija się tylko dofile1
. 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.ac
… part.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
program -f file1 -f file2 -f file3
, możesz zrobićprogram "-f file"{1..3}
program
otrzymuje trzy słowa:"-f file1" "-f file2" "-f file3"
, zamiast 6:"-f" "file1" "-f" "file2" "-f" "file3"
.for
jest trochę bezcelowe, ponieważ możesz pisaćfor ((i=1; i<=100; i++))
i jest bardziej wydajne.