Quand utilisez-vous l'expansion des corsets?


49

Je comprends ce qu'est l' extension du corset , mais je ne sais pas comment l'utiliser au mieux.

Quand l'utilisez vous?
S'il vous plaît, apprenez-moi quelques exemples pratiques et remarquables si vous avez votre propre astuce.

Réponses:


52

L'extension d'accolade est très utile si vous avez des noms de chemin longs. Je l'utilise comme un moyen rapide de sauvegarder un fichier :

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

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

Vous pouvez également l'utiliser dans une séquence . Je l'ai déjà fait pour télécharger de nombreuses pages du Web:

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

ou

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

8
Ceci peut également être utilisé pour la duplication d'arguments. Supposons que vous ayez un programme nécessitant un argument '-f' pour que chaque fichier fonctionne. au lieu de faire program -f file1 -f file2 -f file3, vous pouvez le faireprogram "-f file"{1..3}
Patrick

C'est une honte. Je viens de le découvrir mais fais la sauvegarde sur des chemins extra-longs pendant des années sans le savoir. Merci.
smonff

2
@Patrick: Cela échoue parce que programreçoit trois mots: "-f file1" "-f file2" "-f file3", au lieu de 6: "-f" "file1" "-f" "file2" "-f" "file3".
musiphil

@dogbane: Utiliser l'expansion pour une utilisation en forboucle est un peu inutile, car vous pouvez écrire for ((i=1; i<=100; i++))et c'est plus efficace.
musiphil

30

Le développement d'accolades est très utile lors de la création de grandes structures de répertoires:

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

Cela vous donnera

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

Vous pouvez même aller un peu plus loin et intégrer l’expansion d’attelle à son développement:

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

Cela vous donnera la même structure de répertoire que l'exemple ci-dessus.


3
L'imbrication est agréable, mais votre exemple d'imbrication ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) ne sert à rien. Vous auriez pu faire ceci: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
iconoclast

@iconoclast, cela sert à quelque chose si vous interprétez subdir1et subdir2dans un sens non littéral. Remplacer subdir1par catet subdir2avec dogpar exemple.
ephsmith

2
@ephsmith: si vous interprétez "subdir1" comme représentant "cat" et "subdir2" pour "chien", l'exemple d'imbrication échoue puisqu'il utilise subdir {1,2} et qu'il n'y a aucune chaîne que vous puissiez remplacer. "subdir" avec qui fera subdir {1,2} return {cat, dog}.
iconoclast

21

Je l'utilise quand je veux réduire la dactylographie:

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

Un autre exemple:

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

12

Je l'utilise pour comparer la sortie de test réelle à la sortie de test souhaitée pendant le développement. Si le test n ° 41 échoue, il est facile de voir la différence entre la sortie de test (dans le fichier tests.output / 041) et la sortie souhaitée (dans le fichier tests.out / 041):

$ diff tests.{out,output}/041

10

Quelques cas fréquents pour moi sont:

Pour renommer:

mv myText.{txt,tex}

ou

mv myText.tex{,.old}

ou

cp myText.tex{,.backup}

(Bien que l'utilisation du contrôle de version pour les 2 dernières tâches soit moins compliquée.)

Pour comparer (déjà mentionné):

diff path{1,2}/a.txt

3

Il existe plusieurs bonnes réponses ici, mais aucune d’entre elles ne mentionne le moment où il ne faut pas utiliser l’expansion par attelle. Comme les autres répondeurs, j'utilise assez souvent le développement d'accolade sur la ligne de commande. Je l'utilise également dans mes alias et fonctions, car je peux m'attendre à un shell intelligent.

Je ne pas l' utiliser dans mes scripts shell (sauf si il y a une autre raison pour laquelle les scripts doivent être bash ou zsh, bien que dans ces cas, il est préférable de passer à un langage de script « réel » comme perlou python). L’expansion de l’accolade n’est pas portable car elle n’est pas dans la norme du shell POSIX. Même si cela fonctionne dans vos /bin/sh- Shebang scripts shell ed, il ne fonctionnera pas sur les systèmes avec plus dépouillées /bin/shcoquilles (par exemple dash).

Dans le cas d'une différence d'un chiffre, vous n'avez pas besoin d'expansion d'accolade; une classe de personnage suffira:

Bashisme:

diff file{1,2}

Portable:

diff file[12]

3
Une différence est que file{1,2}les extensions de fichiers seront toujours étendues file1 file2, alors file[12]que les noms de fichiers existants seront étendus: c'est-à-dire que, s'ils file1existent mais file2ne le sont pas, file[12]étendus file1uniquement. L’ []extension est en réalité une version restreinte de l’ ?extension (on les appelle des «extensions de noms de chemins»).
musiphil

Correct, le développement d'accolade n'est pas un shell globbing (extension de chemin) C’est un bon exemple qui n’a pas encore été mentionné: l’expansion de l’attelle permet de mieux noter les chemins absents inattendus. Vous pouvez également utiliser Glob Inside Expansion.
Adam Katz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.