Ich habe ein Verzeichnis, das Tausende von Dateien enthält, von denen einige versteckt sind.
Der Befehl ls -a
listet alle Dateien auf, auch versteckte, aber ich muss nur versteckte Dateien auflisten.
Welchen Befehl soll ich verwenden?
command-line
ls
nux
quelle
quelle
ls -ld .*
oderls -ald .*
wird funktionierenAntworten:
Der Befehl :
Listet nur versteckte Dateien auf.
Erklären Sie:
quelle
.
und..
aus dem Spiel auszuschließen . Allerdings wird es auch mit einem Zeichen versteckte Dateinamen wie auszuschließen ist (völlig legal).a
,.1
und so weiter. Vielleicht wäre eine bessere erweiterten glob sein.!(|.)
dh wörtliche Punkt durch nichts außer nichts oder ein anderes (single) gefolgt dh dotls -d .!(|.)
Tut genau das, wonach OP sucht.
quelle
!(pattern-list)
,pattern-list
eine Liste von einem oder mehreren Mustern ist, die durch ein getrennt sind|
, aber es ist für mich verwirrend, dass Sie links von kein Muster haben|
. Könnten Sie mir bitte diese Syntax erklären?.
nicht gefolgt von (nichts oder.
), ohne sich.
selbst und..
.Wenn Sie nur die Dateien in Ihrem aktuellen Verzeichnis haben möchten (keine Rekursion), können Sie dies tun
Dadurch werden die Namen aller Dateien gedruckt, deren Name mit einem beginnt
.
und auf die ein oder mehrere Nicht-Punkt-Zeichen folgen. Beachten Sie, dass dies für Dateien fehlschlägt, deren Name mit aufeinanderfolgenden Punkten beginnt und daher beispielsweise....foo
nicht angezeigt wird.Sie könnten auch verwenden
find
:Das
-mindepth
stellt sicher, dass wir nicht übereinstimmen,.
und das-prune
bedeutet, dassfind
keine Unterverzeichnisse erstellt werden.quelle
arbeitet für mich in Bash.
quelle
.
und..
in BashVerwenden von
find
undawk
,Erläuterung:
find . -type f
-> Listen Sie alle Dateien im aktuellen Verzeichnis zusammen mit dem Pfad wie folgt auf:awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
Als Feldtrenner sucht awk nach dem letzten Feld, das mit einem Punkt markiert ist oder nicht. Beginnt es mit einem Punkt, wird das letzte Feld der entsprechenden Zeile gedruckt.quelle
find -type f
. Sie müssen den Suchpfad oder nicht explizit festlegen-name "*"
.find
ist in der Regel eine bessere Option für komplizierte Suchvorgänge als die Verwendung von Namensglobbing.oder
find .
Durchsucht das aktuelle Verzeichnis-mindepth 1
schließt aus. und .. aus der Liste-maxdepth 1
begrenzt die Suche auf das aktuelle Verzeichnis-name '.*'
Suchen Sie nach Dateinamen, die mit einem Punkt beginnen-o
oder-name '*~'
nach Dateinamen suchen, die mit einer Tilde enden (normalerweise sind dies Sicherungsdateien von Textbearbeitungsprogrammen)In dieser und allen anderen Antworten fehlen jedoch Dateien, die sich in der
.hidden
Datei des aktuellen Verzeichnisses befinden . Wenn Sie ein Skript schreiben, lesen diese Zeilen die.hidden
Datei und zeigen die Dateinamen der vorhandenen an.quelle
.hidden
Datei? Warum sollte es jemals eine Datei geben.hidden
, die die Dateinamen enthält? Wie auch immer, wenn es einen gibt, warum würden Sie dann etwas so Komplexes tun, wenn alles, was Sie brauchen würden, wärecat .hidden
? Ihrfind
Befehl ist korrekt (ish), aber das-name '*~'
ist irrelevant. Dateien, die auf tildes enden, sind Sicherungsdateien, die jedoch in keiner Weise verborgen sind..hidden
Datei ist für Dateien und Ordner vorgesehen, die ausgeblendet werden sollen , wenn Sie den Datei- / Ordnernamen nicht so ändern können, dass er mit einem Punkt beginnt. Was Dateien betrifft, die auf Tilden enden, hängt dies vom System ab.ls -B
ignoriert solche Dateien ebenso wie die meisten GUI-Datei-Explorer.cat .hidden
zeigt möglicherweise Dateien an, die nicht mehr vorhanden sind, wenn diese Dateien seit dem Hinzufügen zur.hidden
Datei gelöscht oder verschoben wurden .Ich denke, dass Sie es mit folgendem Befehl tun können.
ls -a
Der von Ihnen eingegebene Befehl zeigt alle Dateien und Verzeichnisse im aktuellen Arbeitsverzeichnis an.grep "^\."
Befehl, den ich angehängt habe, der die Ausgabe filtert, um nur versteckte Dateien anzuzeigen (der Name beginnt mit"."
).grep -v "^\.$" | grep -v "^\..$"
Befehl, den ich angehängt habe, der die Ausgabe filtert, um auszuschließen., .. (Sie sind aktuell und übergeordnetes Verzeichnis).Wenn einige Dateinamen mehr als eine Zeile mit haben können
"\n"
, könnte das obige Beispiel falsch sein.Deshalb schlage ich vor, dem Befehl zu folgen, um das Problem zu lösen.
quelle
ls
.Was Sie sonst noch hätten tun können,
is ls .?*
oderls .!(|)
das zeigt Ihnen alles in dem aktuellen Verzeichnis versteckte Dateien / Verzeichnisse oben und andere Dateien / Verzeichnisse untenzB: von meinem Terminal
Beachten Sie nun, dass in den obigen Ergebnissen alle Dateien / Verzeichnisse mit ihrem Unterverzeichnis und alle versteckten Dateien direkt darunter angezeigt werden.
Entschuldigung, ich kann keinen Kommentar abgeben. den Unterschied hier zwischen zu erklären
ls .?*
und @ cioby23 Antwortls -d .[!.]* .??*
und warum es eigentlich versteckte Dateien zweimal Druck ist , weil buchstäblich zweimal Sie fragen.??*
,.?*
,.[!.]*
sind sie die gleiche Sache, so dass jeder von ihnen mit verschiedenen Befehlszeichen Hinzufügen zweimal gedruckt wird.quelle
Sie können auch verwenden:
Auf diese Weise können Sie normale versteckte Dateien und versteckte Dateien anzeigen, die mit zwei oder drei Punkten beginnen, zum Beispiel:
..hidden_file
quelle
Sie können den Befehl verwenden
Dies hat den Vorteil, dass im Gegensatz zum grep-basierten Ansatz in den
ls -a | grep "^\."
Lösungen eine mehrspaltige Auflistung möglich istquelle
Alle bisherigen Antworten basieren auf der Tatsache, dass Dateien (oder Verzeichnisse), deren Namen mit einem Punkt beginnen, "versteckt" sind. Ich habe eine andere Lösung gefunden, die möglicherweise nicht so effizient ist, bei der jedoch keine Angaben zu den Namen der versteckten Dateien gemacht werden. Daher wird eine Auflistung
..
im Ergebnis vermieden (ebenso wie die derzeit akzeptierte Antwort).Der vollständige Befehl lautet:
Erläuterung
Auf diese Weise werden alle Dateien (und Verzeichnisse) zweimal aufgelistet.
Es werden jedoch nur einmal versteckte Dateien angezeigt
-A
.Anschließend wird die Liste sortiert
| sort
, wodurch reguläre (nicht ausgeblendete) Dateien zweimal und nebeneinander angezeigt werden.Entfernen Sie dann alle Zeilen, die mehrmals vorkommen
| uniq -u
, und lassen Sie nur einzelne Zeilen übrig.Verwenden Sie schließlich
ls
erneut, um alle Dateien mit den benutzerdefinierten Optionen des Benutzers aufzulisten, ohne den Inhalt der Verzeichnisse in der Liste aufzulisten-d
.EDIT (Einschränkungen):
Wie muru betonte, wird diese Lösung nicht richtig funktionieren, wenn es Dateien mit Namen gibt, zum Beispiel
escaped\ncharacter.txt
weilecho -e
der Dateiname in zwei Zeilen aufgeteilt wird. Es wird auch nicht wie erwartet funktionieren, wenn es zwei versteckte Dateien mit fast dem gleichen Namen mit Ausnahme eines Sonderzeichen, wie.foo[tab].txt
und.foo[new-line].txt
wie diese beiden sind gedruckt , wie.foo?.txt
und würden durch beseitigt werdenuniq -u
quelle
.
dem ersten Zeichen...
, aber ich frage mich, wie gut es mit Dateinamen funktioniert, die Sonderzeichen enthalten.echo -e
die interpretiert werden. Außerdem:ls
Verfälscht Dateinamen nicht, sodass zwei unterschiedliche Dateinamen gleich angezeigt werden (in einigen Versionenls
werden sie beispielsweise?
für Sonderzeichen verwendet, sodass.foo\tbar
(\t
=> Tab) und.foo\nbar
(\n
=> Newline) beide als angezeigt werdenfoo?bar
).Alternativ können Sie auch verwenden
echo .*
z.B
Wenn Sie es in einem langen Listenformat bevorzugen, konvertieren Sie einfach den Leerraum in eine neue Zeile.
quelle
Mit bash
GLOBIGNORE
genügt es, die Spezialvariable auf einen nicht leeren Wert zu setzen, damit sie ignoriert.
und..
beim Erweitern von Globs. Aus den Bash-Dokumenten :Wenn wir es auf setzen
.:..
, werden beide.
und..
ignoriert. Da das Setzen auf einen Wert ungleich Null auch dieses Verhalten hervorruft, können wir es genauso gut auf den Wert just setzen.
Damit:
quelle