När använder du stagutvidgning?

Jag förstår vad brace expansion är, men jag vet inte hur man bäst kan använd det.

När använder du det?
Lär mig några praktiska och anmärkningsvärda exempel om du har ditt eget tips.

Svar

Brace-expansion är mycket användbart om du har långa sökvägsnamn. Jag använder det som ett snabbt sätt att säkerhetskopiera en fil :

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

kopierar /a/really/long/path/to/some/file.txt till /a/really/long/path/to/some/file.txt.bak

Du kan också använda den i en sekvens . Jag gjorde en gång för att ladda ner många sidor från webben:

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

eller

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

Kommentarer

  • Detta kan också användas för duplicering av argument. Säg att du har något program som kräver ett ’ -f ’ argument för alla fil för att fungera. istället för att göra program -f file1 -f file2 -f file3 kan du göra program "-f file"{1..3}
  • Det är synd. Jag upptäckte det just men gör backup-saken på extra långa vägar i flera år utan att känna till rhis. Tack.
  • @Patrick: Det misslyckas eftersom program får tre ord: "-f file1" "-f file2" "-f file3", istället för 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Att använda expansion för användning i en for -slinga är lite meningslöst, eftersom du kan skriva for ((i=1; i<=100; i++)) och det är effektivare.

Svar

Brace expansion kommer mycket bra när du skapar stora katalogstrukturer:

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

Detta ger dig

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

Du kan till och med gå ett steg längre och sätta brace-expansion i brace-expansion:

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

Detta ger dig samma katalogstruktur som exemplet ovan.

Kommentarer

  • Nestning är trevligt, men ditt boendeexempel (mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) gör inte ’ tjänar faktiskt inte något syfte. Du kunde bara ha gjort detta: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
  • @iconoclast, det tjänar ett syfte om du tolkar subdir1 och subdir2 i icke-bokstavlig mening. Ersätt subdir1 med cat och subdir2 med dog till exempel.
  • @ephsmith: om du tolkar ” underdir1 ” som att stå i ” katt ” och ” underdir2 ” för ” hund ”, då misslyckas nestningsexemplet, eftersom det använder undermapp {1,2} och det inte finns någon sträng som du kan ersätta ” underadress ” med det gör att underdirektiv {1,2} returnerar {cat, dog}.

Svar

Jag använder det när jag vill minska skrivningen:

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

Ett annat exempel:

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

Svar

Jag använder det för att jämföra faktiskt testutgång till önskad testutgång under utveckling. Om test nr 41 misslyckas är det lätt att se vilken skillnad som finns mellan testutgången (i filtest.output / 041) och den önskade utgången (i filtests.out / 041):

$ diff tests.{out,output}/041 

Svar

Några vanliga fall för mig är:

För att byta namn på:

mv myText.{txt,tex} 

eller

mv myText.tex{,.old} 

eller

cp myText.tex{,.backup} 

(Även om det är mindre rörigt att använda versionskontroll för de två senaste uppgifterna.)

För att jämföra (redan nämnt):

diff path{1,2}/a.txt 

Svar

Det finns flera fantastiska svar här, men ingen av dem nämner när inte för att använda brace-expansion. Liksom de andra svararna använder jag brace-expansion på kommandoraden ganska mycket. Jag använder det också i mina alias och funktioner eftersom jag kan förvänta mig ett smart skal.

Jag använder inte det i mina skalskript (såvida det inte finns någon annan anledning till skript bör vara bash eller zsh, men i dessa fall är det bäst att uppgradera till ett ”riktigt” skriptspråk som perl eller python ). Brace-expansion är inte bärbar eftersom den inte finns i POSIX-skalstandarden. Även om det fungerar i din /bin/sh shebang ed skalskript, fungerar det inte på system med mer avskalade /bin/sh skal (t.ex. dash).

I fallet med en skillnad på en siffra behöver du inte hänga ut, en karaktärsklass räcker:

Bashism:

diff file{1,2} 

Portabel:

diff file[12] 

Kommentarer

  • En skillnad är att file{1,2} alltid kommer att expandera till file1 file2, medan file[12] expanderar endast till befintliga filnamn: dvs. om file1 finns men file2 inte ’ t, file[12] expanderar endast till file1. [] -utbyggnaden är verkligen en begränsad version av ? expansion (och de kallas ” sökvägsexpansioner ”).
  • Korrekt, brace-expansion är inte shell globbing (aka pathname expansion). Att ’ är ett bra utrop som inte har

    t har verkligen nämnts ännu: hängsexpansion är bättre att notera oväntat frånvarande vägar. Du kan också globera inuti brace-expansion.

Svar

Efter att ha delat en mycket stor fil med

split -b 100m hugeFile.zip part. 

låt oss anta att den delades i 262 delar, med andra ord part.aa, part.ab, part.acpart.kb

Du kan gå med i dessa bitar igen genom att häcka brace expansions , så här

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *