So listen Sie Dateien auf, die mit "a" oder "c" von / etc. Beginnen.


10

Ich habe es versucht, ls /etc/[ac]*aber es zeigt Verzeichnisse, die mit a oder c beginnen , und deren gesamten Inhalt, nicht die Dateien, die mit " a " oder " c " beginnen.


Verzeichnisse sind eine von vielen Arten von Dateien . Für welche Dateitypen interessieren Sie sich (regulär, Symlink, Gerät, Pipe, Socket ...)?
Stéphane Chazelas

Antworten:


23

Um zu vermeiden, dass der Inhalt von Verzeichnissen aufgelistet wird, können Sie:

ls -d /etc/[ac]*

Das wird die Verzeichnis - Liste Namen zusammen mit gewöhnlichen Dateinamen beginnend mit aoder c.

Der Vollständigkeit halber findkönnte eine Lösung ohne Einbeziehung sein:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9

Meine anfängliche Lektüre der Frage ls -dschien ebenfalls angemessen, aber es scheint, dass die ursprüngliche Frage angibt, dass keine Verzeichnisse aufgelistet werden sollten, unabhängig von der Erweiterung oder Nichterweiterung.
Chris Down

1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9nicht analysieren ls.
Avinash Raj

1
@AvinashRaj: Nun, die Relevanz dieses Ratschlags hängt davon ab, ob diese Lösung einmal oder für immer funktioniert. Wenn auch nur einmal, dann ist das Parsen lsmeiner Meinung nach ein faires Spiel.
Greg Hewgill

3
Er hat einen Punkt. Während Namen in /etcsehr wahrscheinlich vernünftig sind, wird ein einfaches Leerzeichen den lsAnsatz unterbrechen, da sich die Feldnummern ändern. +1 für ls -ldobwohl.
Terdon

1
Sie müssen auch das Gebietsschema ( LC_ALL=C) korrigieren. Es ist nicht garantiert, dass das Datum 3 Felder in anderen Gebietsschemas enthält.
Stéphane Chazelas

7

Rekursiv:

find /etc -type f -name '[ac]*'

Wenn Sie keine Rekursion benötigen, können Sie dies portabel tun:

find /etc/. ! -name . -prune -type f -name '[ac]*'

Oder dies nicht portabel (GNU oder ein aktueller BSD-Fund):

find /etc -type f -maxdepth 1 -name '[ac]*'

Wenn Sie diesen Fall unempfindlich ausführen möchten, verwenden Sie -inameanstelle von -name.


1
Beachten Sie, dass dies -type ffür reguläre Dateien gilt . Wenn Sie stattdessen Nicht-Verzeichnisdateien benötigen, ersetzen Sie diese durch ! -type d(oder ! -xtype ddurch GNU, findwenn Sie auch Symlinks zu Verzeichnissen ausschließen möchten).
Stéphane Chazelas

1

Sie können diesen Befehl auch versuchen,

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'

1

Wenn Sie sowohl Directorys (nicht den Inhalt des Verzeichnisses) als auch Dateien möchten, können Sie printfbultin verwenden:

printf "%s\n" [ac]*

Beispiel:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt

Wie werden Verzeichnisse vermieden, wie in der Frage gefordert?
Chris Down

Oh, meine Fehlinterpretation. Ich denke, OP will Verzeichnis, aber nicht seinen Inhalt.
Cuonglm

Entschuldigung für diese Änderung, völlig falsch verstanden.
Terdon

1

Nicht rekursiv ohne find:

ls -pd /etc/[ac]* | grep -v '/$'

Das -pfügt /am Ende ein für Verzeichnisse hinzu, die das grepherausfiltert. Funktioniert natürlich nicht für Dateinamen, die Sonderzeichen wie Zeilenumbrüche enthalten.


1

Mit zsh:

print -rl /etc/[ac]*(.)

Würde die regulären Dateien (wie in -type fin find) auflisten, in /etcderen Namen mit aoder beginnt c. Der (xxx)Teil am Ende eines Globs ist eine zsh-spezifische Funktion, die als Globbing-Qualifizierer bezeichnet wird. .als globbing qualifier bedeutet reguläre datei .

Wenn der Glob nicht übereinstimmt, zshwird der Befehl abgebrochen . Beachten Sie, dass in anderen Bourne-ähnlichen Shells das Muster zu sich selbst erweitert wird, wenn der Glob nicht übereinstimmt, sodass ls -d /etc/[ac]*eine aufgerufene Datei möglicherweise falsch aufgelistet wird, /etc/[ac]*wenn keine Datei mit aoder cin beginnt /etc.

print -rl /etc/[ac]*(^/)

würde die Dateien auflisten, die nicht vom Typ Verzeichnis und sind

print -rl /etc/[ac]*(-^/)

würde die Dateien auflisten, die nach dem Auflösen von Symlinks nicht vom Typ Verzeichnis sind.


-3

Für Anzeigedateien, die mit einem beginnen:

ls etc |  grep ^a

Zum Anzeigen von Dateien ab c:

ls etc |  grep ^c
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.