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.
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.
@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.
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'
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.
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.
Antworten:
Um zu vermeiden, dass der Inhalt von Verzeichnissen aufgelistet wird, können Sie:
Das wird die Verzeichnis - Liste Namen zusammen mit gewöhnlichen Dateinamen beginnend mit
a
oderc
.Der Vollständigkeit halber
find
könnte eine Lösung ohne Einbeziehung sein:quelle
ls -d
schien ebenfalls angemessen, aber es scheint, dass die ursprüngliche Frage angibt, dass keine Verzeichnisse aufgelistet werden sollten, unabhängig von der Erweiterung oder Nichterweiterung.ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
nicht analysierenls
.ls
meiner Meinung nach ein faires Spiel./etc
sehr wahrscheinlich vernünftig sind, wird ein einfaches Leerzeichen denls
Ansatz unterbrechen, da sich die Feldnummern ändern. +1 fürls -ld
obwohl.LC_ALL=C
) korrigieren. Es ist nicht garantiert, dass das Datum 3 Felder in anderen Gebietsschemas enthält.Rekursiv:
Wenn Sie keine Rekursion benötigen, können Sie dies portabel tun:
Oder dies nicht portabel (GNU oder ein aktueller BSD-Fund):
Wenn Sie diesen Fall unempfindlich ausführen möchten, verwenden Sie
-iname
anstelle von-name
.quelle
-type f
für reguläre Dateien gilt . Wenn Sie stattdessen Nicht-Verzeichnisdateien benötigen, ersetzen Sie diese durch! -type d
(oder! -xtype d
durch GNU,find
wenn Sie auch Symlinks zu Verzeichnissen ausschließen möchten).Sie können diesen Befehl auch versuchen,
quelle
Wenn Sie sowohl Directorys (nicht den Inhalt des Verzeichnisses) als auch Dateien möchten, können Sie
printf
bultin verwenden:Beispiel:
quelle
Nicht rekursiv ohne
find
:Das
-p
fügt/
am Ende ein für Verzeichnisse hinzu, die dasgrep
herausfiltert. Funktioniert natürlich nicht für Dateinamen, die Sonderzeichen wie Zeilenumbrüche enthalten.quelle
Mit
zsh
:Würde die regulären Dateien (wie in
-type f
infind
) auflisten, in/etc
deren Namen mita
oder beginntc
. 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,
zsh
wird der Befehl abgebrochen . Beachten Sie, dass in anderen Bourne-ähnlichen Shells das Muster zu sich selbst erweitert wird, wenn der Glob nicht übereinstimmt, sodassls -d /etc/[ac]*
eine aufgerufene Datei möglicherweise falsch aufgelistet wird,/etc/[ac]*
wenn keine Datei mita
oderc
in beginnt/etc
.würde die Dateien auflisten, die nicht vom Typ Verzeichnis und sind
würde die Dateien auflisten, die nach dem Auflösen von Symlinks nicht vom Typ Verzeichnis sind.
quelle
Für Anzeigedateien, die mit einem beginnen:
Zum Anzeigen von Dateien ab c:
quelle