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
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
ochsubdir2
i icke-bokstavlig mening. Ersättsubdir1
medcat
ochsubdir2
meddog
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 tillfile1 file2
, medanfile[12]
expanderar endast till befintliga filnamn: dvs. omfile1
finns menfile2
inte ’ t,file[12]
expanderar endast tillfile1
.[]
-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.ac
… part.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
program -f file1 -f file2 -f file3
kan du göraprogram "-f file"{1..3}
program
får tre ord:"-f file1" "-f file2" "-f file3"
, istället för 6:"-f" "file1" "-f" "file2" "-f" "file3"
.for
-slinga är lite meningslöst, eftersom du kan skrivafor ((i=1; i<=100; i++))
och det är effektivare.