Når bruker du spenneutvidelse?

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

  • Dette kan også brukes til argument duplisering. Si at du har noe program som krever et ‘ -f ‘ argument for alle fil for å operere. i stedet for å gjøre program -f file1 -f file2 -f file3, kan du gjøre program "-f file"{1..3}
  • Dette er synd. Jeg har nettopp oppdaget det, men gjør sikkerhetskopiering på ekstra lange stier i årevis uten å vite rhis. Takk.
  • @Patrick: Det mislykkes fordi program får tre ord: "-f file1" "-f file2" "-f file3", i stedet for 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Å bruke utvidelse til bruk i en for sløyfe er litt meningsløs, siden du kan skrive for ((i=1; i<=100; i++)) og det er mer effektivt.

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 og subdir2 i ikke-bokstavelig forstand. Erstatt subdir1 med cat og subdir2 med dog 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 til file1 file2, mens file[12] bare utvides til eksisterende filnavn: dvs. hvis file1 eksisterer, men file2 ikke ‘ t, file[12] utvides bare til file1. [] 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.acpart.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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *