Jeg forstår hva brace-utvidelse er, men jeg vet ikke hvordan det er best å bruk den.
Når bruker du den?
Lær meg noen praktiske og bemerkelsesverdige eksempler hvis du har ditt eget tips.
Svar
Brace-utvidelse er veldig nyttig hvis du har lange banenavn. Jeg bruker det som en rask måte å sikkerhetskopiere en fil :
cp /a/really/long/path/to/some/file.txt{,.bak}
kopierer /a/really/long/path/to/some/file.txt
til /a/really/long/path/to/some/file.txt.bak
Du kan også bruke den i en sekvens . Jeg gjorde det en gang for å last ned mange sider fra nettet:
wget http://domain.com/book/page{1..5}.html
eller
for i in {1..100} do #do something 100 times done
Kommentarer
Svar
Brace-utvidelse er veldig nyttig når du lager store katalogstrukturer:
mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
Dette gir deg
find dir1 -type d dir1 dir1/subdir1 dir1/subdir1/subsubdir1 dir1/subdir1/subsubdir2 dir1/subdir2 dir1/subdir2/subsubdir1 dir1/subdir2/subsubdir2
Du kan til og med gå et skritt videre og sette brace-utvidelse i brace-utvidelse:
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
Dette gir deg den samme katalogstrukturen som eksemplet ovenfor.
Kommentarer
- Nesting er fint, men nesteksempelet ditt (
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
) gjør ikke ‘ tjener faktisk ikke noe formål. Du kunne bare ha gjort dette:mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
. - @iconoclast, det tjener et formål hvis du tolker
subdir1
ogsubdir2
i ikke-bokstavelig forstand. Erstattsubdir1
medcat
ogsubdir2
meddog
for eksempel. - @ephsmith: hvis du tolker » underdir1 » som å stå i » cat » og » underdir2 » for » hund «, da mislykkes hekkingseksemplet, siden det bruker undermappe {1,2}, og det er ingen streng du kan erstatte » underkatalog » med det som gjør at underkatalog {1,2} returnerer {katt, hund}.
Svar
Jeg bruker det når jeg vil redusere skrive:
geany /path/to/file1 /path/to/file2 # versus geany /path/to/file{1,2}
Et annet eksempel:
wajig install libpam0g-dev libiw-dev libdb-dev # versus wajig install lib{pam0g,iw,db}-dev
Svar
Jeg bruker det til å sammenligne faktisk testutgang til ønsket testutgang under utvikling. Hvis test nr. 41 mislykkes, er det lett å se hva som er forskjellen mellom testutgangen (i filtester. Utgang / 041) og ønsket utgang (i filtester. Ut / 041):
$ diff tests.{out,output}/041
Svar
Noen hyppige tilfeller for meg er:
For å gi nytt navn:
mv myText.{txt,tex}
eller
mv myText.tex{,.old}
eller
cp myText.tex{,.backup}
(Selv om det er mindre rotete å bruke versjonskontroll for de to siste oppgavene.)
For å sammenligne (allerede nevnt):
diff path{1,2}/a.txt
Svar
Det er flere gode svar her, men ingen av dem nevner når ikke for å bruke brace-utvidelse. Som de andre svarerne bruker jeg brace-utvidelse på kommandolinjen ganske mye. Jeg bruker den også i aliaser og funksjoner siden jeg kan forvente et smart skall.
Jeg bruker ikke det i skallskriptene mine (med mindre det er noen annen grunn til at manusene bør være bash eller zsh, men i slike tilfeller er det best å oppgradere til et «ekte» skriptspråk som perl
eller python
). Brace-utvidelse er ikke bærbar siden den ikke er i POSIX-skallstandarden. Selv om det fungerer i /bin/sh
– shebang ed-skallskriptene, vil det ikke fungere på systemer med mer strippet /bin/sh
skjell (f.eks. dash
).
I tilfelle av forskjellen på et enkelt siffer, trenger du ikke spenneutvidelse. En karakterklasse vil være tilstrekkelig:
Bashism:
diff file{1,2}
Bærbar:
diff file[12]
Kommentarer
- En forskjell er at
file{1,2}
alltid vil utvides tilfile1 file2
, mensfile[12]
bare utvides til eksisterende filnavn: dvs. hvisfile1
eksisterer, menfile2
ikke ‘ t,file[12]
utvides bare tilfile1
.[]
utvidelsen er egentlig en begrenset versjon av?
utvidelse (og de kalles » utvidelser av stienavn «). - Korrekt, stagutvidelse er ikke shell globbing (aka pathname-utvidelse). Den ‘ er en god utrop som ikke har
t virkelig blitt nevnt ennå: brace-utvidelse er bedre til å merke uventet fraværende stier. Du kan også globere deg innenfor brace-utvidelse.
Svar
Etter å ha delt en veldig stor fil med
split -b 100m hugeFile.zip part.
la oss anta at den ble delt i 262 stykker, med andre ord part.aa
, part.ab
, part.ac
… part.kb
Du kan bli med på disse brikkene igjen ved å hekke brace-utvidelser , som dette
cat part.{{a..j}{a..z},k{a..b}} > hugeFile.zip
program -f file1 -f file2 -f file3
, kan du gjøreprogram "-f file"{1..3}
program
får tre ord:"-f file1" "-f file2" "-f file3"
, i stedet for 6:"-f" "file1" "-f" "file2" "-f" "file3"
.for
sløyfe er litt meningsløs, siden du kan skrivefor ((i=1; i<=100; i++))
og det er mer effektivt.