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 Sieprogram "-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 Siefor ((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 undsubdir2
im nicht wörtlichen Sinne. Ersetzen Siesubdir1
durchcat
undsubdir2
durchdog
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 auffile1 file2
erweitert wird, währendfile[12]
nur auf vorhandene Dateinamen erweitert wird: dh Wennfile1
vorhanden ist,file2
jedoch nicht ‚ t,file[12]
wird nur auffile1
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.ac
… part.kb
Sie können diese Teile erneut verbinden, indem Sie Klammererweiterungen , wie folgt
cat part.{{a..j}{a..z},k{a..b}} > hugeFile.zip