Kdy používáte rozšíření rovnátka?

Chápu, co je rozšíření závorky , ale nevím, jak nejlépe použijte jej.

Kdy ji použijete?
Naučte mě prosím několik praktických a pozoruhodných příkladů, pokud máte svůj vlastní tip.

Odpovědět

Rozšíření složených závorek je velmi užitečné, pokud máte dlouhé názvy cest. Používám ho jako rychlý způsob zálohování souboru :

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

zkopíruje /a/really/long/path/to/some/file.txt do /a/really/long/path/to/some/file.txt.bak

Můžete jej také použít v sekvenci . Jednou jsem to udělal stáhněte si spoustu stránek z webu:

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

nebo

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

Komentáře

  • Toto lze použít také pro duplikaci argumentů. Řekněme, že máte nějaký program, který vyžaduje ‚ -f ‚ argument pro všechny soubor, na kterém chcete pracovat. namísto program -f file1 -f file2 -f file3 můžete udělat program "-f file"{1..3}
  • to je škoda. Právě jsem to objevil, ale dělal jsem záložní věc na extra dlouhých cestách po celá léta, aniž bych věděl rhi. Děkuji.
  • @Patrick: To selže, protože program dostane tři slova: "-f file1" "-f file2" "-f file3", místo 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Používání rozšíření pro použití ve smyčce for je trochu zbytečné, protože můžete psát for ((i=1; i<=100; i++)) a je to efektivnější.

Odpověď

Rozšíření složené závorky při vytváření velkých adresářových struktur se velmi hodí:

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

Tím získáte

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

Můžete dokonce jít o krok dále a dát rozšíření závorky do rozšíření závorky:

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

Tím získáte stejnou adresářovou strukturu jako výše uvedený příklad.

Komentáře

  • Vnoření je hezké, ale váš příklad vnoření (mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) ‚ ve skutečnosti neslouží žádnému účelu. Mohli jste to udělat právě takto: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
  • @iconoclast, slouží to účelu, pokud interpretujete subdir1 a subdir2 v jiném než doslovném smyslu. Vyměňte subdir1 za cat a subdir2 za dog například.
  • @ephsmith: pokud interpretujete “ subdir1 “ tak, že zastupujete “ kočka “ a “ subdir2 “ pro “ dog „, pak příklad vnoření selže, protože používá subdir {1,2} a neexistuje žádný řetězec, který byste mohli nahradit “ subdir “ díky tomu se subdir {1,2} vrátí {kočka, pes}.

Odpověď

Používám ho, když chci omezit psaní:

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

Další příklad:

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

Odpověď

Používám jej k porovnání skutečných testovací výstup na požadovaný testovací výstup během vývoje. Pokud test č. 41 selže, snadno zjistíte, jaký je rozdíl mezi výstupem testu (v souboru tests.output / 041) a požadovaným výstupem (v souboru tests.out / 041):

$ diff tests.{out,output}/041 

Odpověď

Některé časté případy pro mě jsou:

K přejmenování:

mv myText.{txt,tex} 

nebo

mv myText.tex{,.old} 

nebo

cp myText.tex{,.backup} 

(Přestože je použití verzí pro poslední 2 úkoly méně komplikované.)

Pro srovnání (již zmíněno):

diff path{1,2}/a.txt 

Odpověď

Zde je několik skvělých odpovědí, ale žádná z nich neuvádí, kdy not použít expanzi složených závorek. Stejně jako ostatní odpovídači používám na příkazovém řádku docela dost rozšíření složených závorek. Používám to také ve svých aliasech a funkcích, protože mohu očekávat inteligentní prostředí.

Nepoužívám ho nepoužívám v mých shell skriptech (pokud není nějaký jiný důvod, proč skripty by měl být bash nebo zsh, i když v takových případech je nejlepší upgradovat na „skutečný“ skriptovací jazyk, jako je perl nebo python ). Rozšíření složené závorky není přenosné , protože není v standard prostředí POSIX. I když to funguje ve vašich /bin/sh shebang ed skriptech prostředí, nebude to fungovat v systémech s více odizolovanými /bin/sh skořápky (např. dash).

V případě rozdílu jedné číslice nepotřebujete rozšíření složených závorek; postačí třída znaků:

Bashism:

diff file{1,2} 

Přenosné:

diff file[12] 

Komentáře

  • Rozdíl je že file{1,2} se vždy rozšíří na file1 file2, zatímco file[12] se rozšíří pouze na existující názvy souborů: tj. pokud file1 existuje, ale file2 není ‚ t, file[12] expanduje pouze na file1. Rozšíření [] je ve skutečnosti omezenou verzí ? expanze (a říká se jim “ rozšíření názvu cesty „).
  • Správně, rozšíření rovnátka není shell globbing (aka rozšíření názvu cesty). To ‚ je dobré volání, které nemá

    o tom ještě nebylo řečeno: rozšíření složených závorek je lepší při zaznamenávání neočekávaně chybějících cest. Můžete také globovat uvnitř expanze složených závorek.

Odpovědět

Po rozdělení velmi velkého souboru pomocí

split -b 100m hugeFile.zip part. 

Předpokládejme, že je rozdělena na 262 částí, jinými slovy part.aa, part.ab, part.acpart.kb

K těmto dílům se můžete znovu připojit vnořením rozšířené závorky , jako je tento

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *