Was bedeuten Sternchen, Backslash, Doppelpunkt und Zwei in (* \: 2)?

3129
jugmac00

Was bedeutet der folgende lsBefehl?

ls -l *\:2,*T 
  • ls = Liste
  • -l = lang (Liste)
  • *Tbedeutet wohl Tam ende

Aber was ist mit *\:2dem Komma?

14

3 Antworten auf die Frage

25
Eugen Rieck

*\:2,*Tist das Glob-Muster der Dateien, die aufgelistet werden sollen. Um es zu verstehen, müssen wir uns ein paar Dinge merken:

  • : muss in der Schale entkommen werden \:
  • Dateinamen können leicht Kommas enthalten

Also *\:2,*Twürde zB eine Datei mit dem Namen übereinstimmenTranscationNumber:2,EventType:XYT

BEARBEITEN

Aus den Kommentaren, der Notwendigkeit (oder nicht) des Fluchtens :bedarf es einiger Worte: Es ist nicht unbedingt notwendig, dem :Zeichen zu entkommen, aber bash selbst schlägt dies beim Autocompleting vor.

Vielen Dank, Eugen und HBruijn. Ich vermutete ein kompliziertes Globbing-Muster, aber eigentlich sollte es nur mit dem Doppelpunkt und dem Komma übereinstimmen, woran ich bei der Arbeit mit Dateien nicht gedacht hatte. Nun macht der Befehl durchaus Sinn: Listen Sie alle E-Mail-Dateien in den Maildir-Verzeichnissen auf, die als "Gelöscht" (T) gekennzeichnet sind. Übrigens Die Zahl 2 bedeutet Maildir in Version 2 (siehe https://wiki2.dovecot.org/MailboxFormat/Maildir). jugmac00 vor 7 Jahren 3
Seit wann muss `:` entkommen werden? Barmar vor 7 Jahren 9
`:` muss nicht maskiert werden. Es ist nur unter bestimmten Umständen (wenn es als Befehl verwendet wird) speziell, nicht in Glob-Mustern. Das `\:` ist äquivalent zu `:`. Escape spielt keine Rolle. terdon vor 7 Jahren 7
@ terdon Ich habe mich gefragt, in welchem ​​Fall es interessant wäre, `\:` als Befehl zu haben, und habe herausgefunden, dass `bash 'immer noch` \: `als NOP-Befehl zu analysieren scheint. Siehe [diese Idee] (http://ideone.com/U4GWei). Ich denke, es war anders in älteren Versionen von Bash oder anderen Shells? Aaron vor 7 Jahren 0
@Barmar Bearbeitet meine Antwort, danke, dass du mich darauf aufmerksam gemacht hast! Eugen Rieck vor 7 Jahren 0
@Aaron, es ist nicht * genau * no-op: Die Shell wird immer noch Variablensubstitutionen verarbeiten, insbesondere die Zuweisungsvielfalt (dh Standardwerte festlegen): `unset var; : $ ; echo $ var` glenn jackman vor 7 Jahren 1
@Aaron Ich würde nicht erwarten, dass `\:` schützt, wenn er nicht als Befehl erkannt wird, da dies ein anderes allgemeines Konstrukt ist, das zum Beispiel verwendet wird, um Aliasnamen zu ignorieren (https://askubuntu.com/a/525242/85695) ). Andererseits führt die Tabulatorvervollständigung für eine Datei, deren Name ein `:` hat, zu `\:`. Ich weiß nicht, warum das passieren würde, aber ich würde vermuten, dass es historisch ist und dass ältere Muscheln daran ersticken würden. Ich habe bash, dash, tcsh und ksh getestet und alle hatten kein Problem mit `:`. Vermutlich taten es einige ältere Muscheln. terdon vor 7 Jahren 0
@terdon danke, ich wusste nicht, wie man den Backslash benutzt, ich hätte `command 'oder` builtin' verwendet, um den gleichen Effekt zu erzielen. Es gibt definitiv etwas Seltsames mit der Autovervollständigung: Ich habe mit bash sowohl auf einem Cygwin als auch auf einem RHEL getestet und einige seltsame Verhaltensweisen erhalten, einschließlich des von Ihnen erwähnten, die Unfähigkeit, direkt nach dem `:` oder noch schlimmer abzuschließen Vorschläge basieren nur auf dem Teil nach dem `:` (dh Fertigstellung nach `test: te`, wobei jede Datei mit 'te' vorgeschlagen wird). Sieht so aus, als könnte es eine gute Idee sein. Aaron vor 7 Jahren 0
@terdon & @Aaron Der Doppelpunkt `:` gehört zu den Standardwerten für die Umgebungsvariable `COMP_WORDBREAKS`. Bei der Bash-Autovervollständigung werden diese Zeichen von der Lesezeilenbibliothek als Worttrennzeichen verwendet, und ein Dateiname, der einen Doppelpunkt enthält, sollte natürlich ein einzelnes Wort sein. Daher ist der Grund für die Bash-Autovervollständigung die Flucht des Doppelpunkts, obwohl ansonsten "* meistens *" kein Sonderzeichen ist ... HBruijn vor 7 Jahren 1
14
HBruijn

Listet alle Dateien auf, die dem Platzhaltermuster entsprechen *:2,*T

Da der Platzhalter *mit irgendetwas übereinstimmt (eine beliebige Anzahl aller möglichen Zeichen),
:2,sind Zeichen, die in den Datei- / Verzeichnisnamen vorhanden sein müssen.
Der Doppelpunkt :ist ein Sonderzeichen, dem entkommen werden muss, daher die Form von \:2,.
Die Datei- / Verzeichnisnamen müssen mit einem T.

Dateinamen, die übereinstimmen würden, wären

:2,T a:2,T a:2,bT abbY-$fafaf:2,<hskjhsgdfhjk>T 
Es gibt nichts Besonderes: Es muss nicht geflüchtet werden. Kevin vor 7 Jahren 1
Die automatische Vervollständigung von @Kevin Bash entgeht automatisch dem Doppelpunkt in den Dateinamen von Mustern, da sie in der Liste der `COMP_WORDBREAK`-Umgebungswerte enthalten ist, die standardmäßig festgelegt werden. - Es handelt sich also in der Tat nicht um ein Sonderzeichen, aber wenn Sie die Autovervollständigung in der Befehlszeile verwenden und Dateinamen mit einem Doppelpunkt abgleichen wollen / müssen, muss es mit einem Escapezeichen versehen werden. HBruijn vor 7 Jahren 0
9
Ángel

Wie bereits von anderen erwähnt, wird dies im langen Format aufgeführt, wobei die Dateien darin enthalten :2sind und in. EndenT

Dies sieht aus wie eine Suche in einem Maildir-Ordner nach Dateien, die gelöscht (in den Papierkorb) wurden. Für die Robustheit hätte es jedoch *am Ende eine andere haben sollen . Neue Flags mit einer späteren alphabetischen Position könnten hinzugefügt werden, und Dovecot beispielsweise fügt ein weiteres Feld mit der Dateigröße am Ende hinzu.