Wie kann man mit _one_shell globbing expression alle Dateien auflisten (natürlich auch versteckte Dateien!)?

1762
math

Ok, diese Frage richtet sich an Unix / Linux-Shells! Ich möchte einen Shell-Globbing- (alias Wildchard-) Ausdruck, der alle Dateien einschließlich versteckter Dateien im aktuellen Verzeichnis nicht rekursiv (maxdepth == 1) angleicht. Bisher muss ich zwei Befehle ausführen oder lange Umgehungslösungen verwenden (siehe unten):

ls -lad *vim* ls -lad .*vim* 

während der Verwendung der zsh. Aber wenn ich mich erinnere, ist es dasselbe für Bash und Bash, richtig?

Kurze Problemumgehungen:

  • ls -la | grep vim
  • find . -maxdepth 1 | grep vim

Aber ich habe mich schon hundertmal gefragt, ob es nicht eine einfache Lösung gibt, und warum *passt das nicht zum Punkt?

7

5 Antworten auf die Frage

11
JdeBP

* stimmt mit einem .Charakter überein

Es stimmt einfach nicht überein, .wenn es das erste Zeichen des Namens ist. Dies stellt einen sogenannten "Punkt-Datei" -Mechanismus zum "Verstecken" von Dateien bereit.

In zsh:

Legen Sie die GLOB_DOTSShell-Option fest. Dies ist in § 14.8 der zshBedienungsanleitung beschrieben. Beachten Sie das .und ..werden immer ausgeschlossen, auch wenn diese Option aktiviert ist.

In bash:

Legen Sie die dotglobShell-Option fest. Dies ist in § 3.5.8 der bashBedienungsanleitung beschrieben. Beachten Sie, dass das Setzen der GLOBIGNOREShell-Variablen implizit festgelegt wird dotglob. das bash(im Gegensatz zu zsh) nicht automatisch ausschließt .und ..wann dotglobaktiviert ist; aber das bash wird das tun, wenn GLOBIGNOREeingestellt ist. Die Einstellung GLOBIGNORE=.bewirkt also das Ein- dotglob und Ausschalten von .und ...

In GNU find:

Tu nichts Ab findutilsder Globbing für 4.2.2, -nameund -iname schon passt Namen mit Punkten als erstes Zeichen. Dies ist in § 2.1.1 der findutilsBedienungsanleitung beschrieben.

Seien Sie vorsichtig damit! In Bash. * Stimmt alles mit einem Verzeichnis überein. Corporal Touchy vor 12 Jahren 3
3
grawity

Aktivieren Sie in der Bash die Dotglob- Option:

shopt -s dotglob 

Standardmäßig sind versteckte Dateien versteckt, um keine Überraschungen und Belästigungen zu verursachen. Beispielsweise laufen Sie lsin Ihrem Home-Verzeichnis, sehen einige Dateien des letzten Monats, versuchen, sie mit zu entfernen rm *net*und Ihre sorgfältig geschriebene Nuke unwichtig zu machen .nethackrc.

Ja, das Aktivieren der Standardeinstellung ist zwar keine gute Idee!, Aber glücklicherweise kann Zsh Optionen über `setopt 'und` unsetopt' einstellen und die Einstellungen aufheben . math vor 12 Jahren 1
3
daniel kullmann

Wenn Sie keine Optionen ändern möchten, können Sie Folgendes tun:

ls -ld {,.}*vim* ls -ld *vim* .*vim* find . -maxdepth 1 -name "*vim*" 
Warum gibt es ein Komma zwischen den Klammern? Stimmt das "*" auch nicht mit dem Komma vor dem Dateinamen überein? Die anderen beiden habe ich bereits als Workarounds angegeben. math vor 12 Jahren 0
@math: In bash kannst du Dinge wie x` → `ax bx cx` verwenden, so dass {,.} * vim *` sich zu zwei Argumenten erweitert: * vim *. * vim * ` grawity vor 12 Jahren 3
2
simou

In ZSH (without changing GLOB_DOTS) you could do

 ls -lad *vim*(D) 
1
user58389

Um auf der Antwort von @daniel kullman aufzubauen, scheint dies mit einem ziemlich einfachen Globus zu erreichen, was Sie wollen, obwohl es nicht unbedingt ein einzelner Tropfen ist.

Suchen Sie rekursiv nach der Zeichenfolge "blah" in allen Dateien im aktuellen Verzeichnis, einschließlich versteckter Dateien, und schließen Sie das ".." aus, durch das die übergeordnete Verzeichnisstruktur durchsucht wird:

grep blah {,.}[!.]*