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.