2009-10-19 8 views
10

Ich verstehe, dass der Platzhalter * (von selbst) so erweitert wird, dass es bedeutet "alle nicht versteckten Dateien im aktuellen Ordner" mit versteckten Dateien, denen ein Punkt vorangestellt ist.Bash Globbing - Autoexpand für einige spezielle Fälle?

Es gibt zwei Anwendungsfälle, die ich denke, wäre nützlich sind, aber ich weiß nicht, wie man richtig zu tun:

  1. Wie kann man für ... „Alle Dateien im aktuellen Ordner glob, einschließlich versteckter Dateien, aber nicht einschließlich . oder .. "?

  2. Wie können Sie glob für ... "Alle versteckten Dateien (und nur versteckte Dateien) im aktuellen Ordner, aber nicht einschließlich . oder .."?

Antwort

15

auf paviums answer zu erweitern und den zweiten Teil Ihrer Frage beantworten, werden alle Dateien außer . und .. könnte wie folgt angegeben werden Shell-Option, so dass bash dotfiles in Erweiterungen von * standardmäßig enthält:

$ shopt -s dotglob 
$ echo * 
.tst 
+2

'{..? *, [^.] *, [^.] *}' Funktioniert unabhängig von der 'dotglob'-Einstellung und vermeidet fehlende Dateinamen beginnend mit zwei Punkten, die alle hier übersehen zu haben scheinen. – ephemient

+1

@ephemient: Das gibt mir eine falsche Übereinstimmung '..? *' Wenn es keine Dateinamen gibt, die mit zwei Punkten beginnen. –

3

Die Bash Cookbook schlägt eine Lösung für Ihre 2. Anforderung vor.

.[!.]* 

als eine Möglichkeit, 'dot-Dateien' zu spezifizieren, aber . und ..

Natürlich ls hat die -A Option zu vermeiden, aber das ist Globbing nicht.

{.[!.]*,*} 

auf Ihren genauen Anwendungsfall Je könnte es besser sein, die dotglob einzustellen:

+2

'Touch ..blah; echo {.,} [!.] * | grep bla "scheitern. – ephemient

1

ersten Fall gerecht zu werden:

echo {.,}[^.]* 

oder

echo {.,}[!.]* 

bearbeiten:

Dies scheint alles zu bekommen, aber kürzer als ephemient ‚s

echo {.*,}[^.]* 
+2

'touch ..blah; echo {.,} [^.] * | grep bla "scheitern. – ephemient

0

Mit "alle Dateien" und "alle versteckten Dateien" meinst du nur Dateien, oder meinst du beide f ile und Verzeichnisse? Globbing funktioniert auf Namen unabhängig davon, ob es zu einer Datei oder einem Verzeichnis gehört. Die anderen Leute geben gute Antworten für die Verwendung von Globbing, um versteckte vs nicht-versteckte Namen zu finden, aber Sie können den find Befehl als eine einfachere Alternative verwenden, die zwischen den Typen unterscheiden kann.

„Alle Dateien im aktuellen Ordner, versteckte Dateien, einschließlich, aber ohne oder ...“ So zu finden:

find . -type f 

„Alle Dateien und Verzeichnisse im aktuellen Ordner zu finden, versteckte Dateien, einschließlich, aber nicht einschließlich oder ..":

find . ! -name . 

Zu finden" Alle versteckten Dateien (und nur versteckte Dateien) im aktuellen Ordner, aber nicht inklusive. oder .. „:

find . -name '.*' -type f 

zu finden“ Alle Dateien und Verzeichnisse (und nur versteckte Dateien und Verzeichnisse) im aktuellen Ordner, aber nicht einschließlich. oder .. ":

find . -name '.*' ! -name . 

Beachten Sie, dass find standardmäßig durch Verzeichnisse rekursiv wird auch so, wenn Sie es nur das aktuelle Verzeichnis beschränken möchten Sie verwenden können:

find . -maxdepth 1 -type f 
1

Kombination sth und pavium Antworten

# dot files but avoiding . and .. 
.[!.]* 

# all files but avoiding . and .. 
{.[!.]*,*} 
0

also, auch wenn diese alt ist - ohne shopt zu verwenden, dies scheint nicht vollständig beantwortet zu haben, aber, die Erweiterung auf das, was als Antworten gegeben wurde bisher, diese Arbeit für mich.

1:

{*,.[!.]*,..?*}

2:

{.[!.]*,..?*}