Wann verwenden Sie die Klammererweiterung?

Ich verstehe, was Klammererweiterung ist, aber ich weiß nicht, wie ich es am besten machen soll Verwenden Sie es.

Wann verwenden Sie es?
Bitte bringen Sie mir einige praktische und bemerkenswerte Beispiele bei, wenn Sie einen eigenen Tipp haben.

Antwort

Die Erweiterung der Klammer ist sehr nützlich, wenn Sie lange Pfadnamen haben. Ich verwende sie als schnelle Möglichkeit, um eine Datei zu sichern :

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

kopiert /a/really/long/path/to/some/file.txt nach /a/really/long/path/to/some/file.txt.bak

Sie können es auch in einer -Sequenz verwenden. Ich habe dies einmal getan Laden Sie viele Seiten aus dem Internet herunter:

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

oder

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

Kommentare

  • Dies kann auch zum Duplizieren von Argumenten verwendet werden. Angenommen, Sie haben ein Programm, für das ein ‚ -f Argument für jeden Datei zu bearbeiten. Anstatt program -f file1 -f file2 -f file3 auszuführen, können Sie program "-f file"{1..3}
  • ausführen. Dies ist eine Schande. Ich habe es gerade erst entdeckt, mache aber jahrelang das Backup auf extra langen Pfaden, ohne Rhis zu kennen. Danke.
  • @Patrick: Das schlägt fehl, weil program drei Wörter erhält: "-f file1" "-f file2" "-f file3" anstelle von 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Die Verwendung der Erweiterung zur Verwendung in einer for -Schleife ist etwas sinnlos, da Sie for ((i=1; i<=100; i++)) und es ist effizienter.

Antwort

Klammererweiterung Dies ist sehr praktisch, wenn Sie große Verzeichnisstrukturen erstellen:

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

Dadurch erhalten Sie

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

Sie können sogar noch einen Schritt weiter gehen und die Klammererweiterung in die Klammererweiterung einfügen:

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

Dadurch erhalten Sie dieselbe Verzeichnisstruktur wie im obigen Beispiel.

Kommentare

  • Die Verschachtelung ist nett, aber Ihr Verschachtelungsbeispiel (mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) funktioniert nicht ‚ erfüllt eigentlich keinen Zweck. Sie hätten dies einfach tun können: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
  • @iconoclast, es hat einen Zweck, wenn Sie subdir1 interpretieren und subdir2 im nicht wörtlichen Sinne. Ersetzen Sie subdir1 durch cat und subdir2 durch dog zum Beispiel.
  • @ephsmith: Wenn Sie “ subdir1 “ als Ersatz für “ cat “ und “ subdir2 “ für “ dog „, dann schlägt das Verschachtelungsbeispiel fehl, da es das Unterverzeichnis {1,2} verwendet und es keine Zeichenfolge gibt, die Sie ersetzen können “ Unterverzeichnis “ Damit wird das Unterverzeichnis {1,2} {cat, dog} zurückgeben.

Antwort

Ich verwende es, wenn ich die Eingabe reduzieren möchte:

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

Ein weiteres Beispiel:

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

Antwort

Ich verwende es, um die tatsächlichen Werte zu vergleichen Testausgabe auf gewünschte Testausgabe während der Entwicklung. Wenn Test Nr. 41 fehlschlägt, ist der Unterschied zwischen der Testausgabe (in der Datei tests.output / 041) und der gewünschten Ausgabe (in der Datei tests.out / 041) leicht zu erkennen:

$ diff tests.{out,output}/041 

Antwort

Einige häufige Fälle für mich sind:

Zum Umbenennen:

mv myText.{txt,tex} 

oder

mv myText.tex{,.old} 

oder

cp myText.tex{,.backup} 

(Obwohl es weniger umständlich ist, die Versionskontrolle für die letzten beiden Aufgaben zu verwenden.)

Zum Vergleichen (bereits erwähnt):

diff path{1,2}/a.txt 

Antwort

Hier gibt es mehrere gute Antworten, aber keine davon erwähnt, wenn nicht , um die Klammererweiterung zu verwenden. Wie die anderen Antwortenden verwende ich die Klammererweiterung in der Befehlszeile ziemlich oft. Ich verwende es auch in meinen Aliasnamen und Funktionen, da ich eine intelligente Shell erwarten kann.

Ich verwende es nicht in meinen Shell-Skripten (es sei denn, es gibt einen anderen Grund für die Skripte sollte bash oder zsh sein, in diesen Fällen ist es jedoch am besten, auf eine „echte“ Skriptsprache wie perl oder python zu aktualisieren ). Die Klammererweiterung ist nicht portierbar , da sie nicht vorhanden ist der POSIX-Shell-Standard. Selbst wenn es in Ihren /bin/sh shebang ed-Shell-Skripten funktioniert, funktioniert es nicht auf Systemen mit mehr Stripped /bin/sh Shells (z. B. dash).

Bei einem Unterschied von einer einzelnen Ziffer benötigen Sie keine Klammererweiterung. Eine Zeichenklasse reicht aus:

Bashism:

diff file{1,2} 

Portable:

diff file[12] 

Kommentare

  • Ein Unterschied ist dass file{1,2} immer auf file1 file2 erweitert wird, während file[12] nur auf vorhandene Dateinamen erweitert wird: dh Wenn file1 vorhanden ist, file2 jedoch nicht ‚ t, file[12] wird nur auf file1 erweitert. Die [] -Erweiterung ist wirklich eine eingeschränkte Version von ? -Erweiterung (und sie heißen “ Pfadnamenerweiterungen „).
  • Richtig, Klammererweiterung ist nicht Shell Globbing (auch bekannt als Pfadnamenerweiterung). Das ‚ ist ein guter Aufruf, der nicht

    wurde noch nicht wirklich erwähnt: Die Erweiterung der Klammer ist besser, wenn unerwartet fehlende Pfade festgestellt werden. Sie können die Klammererweiterung auch globalisieren.

Antwort

Nach dem Teilen einer sehr großen Datei mit

split -b 100m hugeFile.zip part. 

Nehmen wir an, es wurde in 262 Teile aufgeteilt, mit anderen Worten part.aa, part.ab, part.acpart.kb

Sie können diese Teile erneut verbinden, indem Sie Klammererweiterungen , wie folgt

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.