Quando usi l'espansione del controvento?


Risposte:


52

L'espansione del controvento è molto utile se si hanno nomi di percorsi lunghi. Lo uso come modo rapido per eseguire il backup di un file :

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

copierà /a/really/long/path/to/some/file.txtsu/a/really/long/path/to/some/file.txt.bak

Puoi anche usarlo in una sequenza . Una volta l'ho fatto per scaricare molte pagine dal Web:

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

o

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

8
Questo può essere usato anche per la duplicazione degli argomenti. Supponi di avere un programma che richiede un argomento '-f' per ogni file su cui operare. invece di farlo program -f file1 -f file2 -f file3, puoi farloprogram "-f file"{1..3}
Patrick

Questo è un peccato. L'ho appena scoperto, ma eseguo il backup su percorsi extra-lunghi per anni senza saperlo. Grazie.
smonff,

2
@Patrick: che non riesce perché programottiene tre parole: "-f file1" "-f file2" "-f file3"invece di 6: "-f" "file1" "-f" "file2" "-f" "file3".
musiphil,

@dogbane: L'uso dell'espansione per l'uso in un forciclo è un po 'inutile, poiché puoi scrivere for ((i=1; i<=100; i++))ed è più efficiente.
musiphil,

30

L'espansione del controvento è molto utile quando si creano strutture di directory di grandi dimensioni:

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

Questo ti darà

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

Potresti anche fare un ulteriore passo avanti e mettere l'espansione del controvento nell'espansione del controvento:

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

Questo ti darà la stessa struttura di directory dell'esempio sopra.


3
La nidificazione è buona, ma il tuo esempio di nidificazione ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) in realtà non ha alcuno scopo. Si potrebbe avere appena fatto questo: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
iconoclasta,

@iconoclast, serve a uno scopo se si interpreta subdir1e subdir2in senso non letterale. Sostituisci subdir1con cate subdir2con dogper esempio.
fabbro il

2
@fsmith: se interpreti "subdir1" come "gatto" e "subdir2" per "cane", l'esempio di nidificazione fallisce, poiché usa subdir {1,2} e non c'è stringa che puoi sostituire "subdir" con questo farà subdir {1,2} restituire {cat, dog}.
iconoclasta il

21

Lo uso quando voglio ridurre la digitazione:

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

Un altro esempio:

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

12

Lo uso per confrontare l'output del test effettivo con l'output del test desiderato durante lo sviluppo. Se il test n. 41 fallisce, è facile vedere quale sia la differenza tra l'output del test (nel file test.output / 041) e l'output desiderato (nel file test.out / 041):

$ diff tests.{out,output}/041

10

Alcuni casi frequenti per me sono:

Per rinominare:

mv myText.{txt,tex}

o

mv myText.tex{,.old}

o

cp myText.tex{,.backup}

(Sebbene sia meno complicato utilizzare il controllo versione per le ultime 2 attività.)

Per il confronto (già menzionato):

diff path{1,2}/a.txt

3

Ci sono molte grandi risposte qui, ma nessuna di esse menziona quando non usare l'espansione del controvento. Come gli altri risponditori, uso un po 'l'espansione della parentesi sulla riga di comando. Lo uso anche nei miei alias e funzioni poiché posso aspettarmi una shell intelligente.

Non lo uso nei miei script di shell (a meno che non ci siano altri motivi per cui gli script dovrebbero essere bash o zsh, anche se in questi casi è meglio passare a un linguaggio di script "reale" come perlo python). L'espansione del controvento non è portatile poiché non è nello standard shell POSIX. Anche se funziona nella vostra /bin/sh- Shebang script di shell ed, non funzionerà su sistemi con più spogliato /bin/shconchiglie (per esempio dash).

Nel caso di una differenza di una sola cifra, non è necessario l'espansione del controvento; sarà sufficiente una classe di caratteri:

da bash:

diff file{1,2}

Portatile:

diff file[12]

3
Una differenza è che file{1,2}si espanderà sempre a file1 file2, mentre si file[12]espande solo ai nomi di file esistenti: cioè se file1esiste ma file2non si file[12]espande a file1solo. L' []espansione è in realtà una versione limitata ?dell'espansione (e sono chiamati "espansioni del percorso").
musiphil,

L'espansione corretta della parentesi graffa non è un globbing della shell (ovvero l'espansione del percorso). Questo è un buon richiamo che non è ancora stato menzionato: l'espansione del rinforzo è migliore nel notare percorsi inaspettatamente assenti. Puoi anche glob all'interno dell'espansione del controvento.
Adam Katz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.