Frage Wie zeigt man nur versteckte Dateien im Terminal an?


Ich habe ein Verzeichnis, das Tausende von Dateien enthält, einige davon sind versteckt.

Der Befehl ls -a listet alle Dateien auf, einschließlich versteckter, aber ich muss nur versteckte Dateien auflisten.

Welchen Befehl soll ich verwenden?


107
2018-05-19 00:10


Ursprung


Eine einfache ls -ld .* oder ls -ald .* wird funktionieren - John Strood


Antworten:


Der Befehl :

ls -ld .?* 

Wird nur versteckte Dateien auflisten.

Erklären:

 -l     use a long listing format

 -d, --directory
              list  directory entries instead of contents, and do not derefer‐
              ence symbolic links

.?* will only state hidden files 

134
2018-05-19 00:10



Sie brauchen die zwei Fragezeichen nicht dort, das * deckt es ab (? Stimmt nur mit einem einzelnen Zeichen überein, * stimmt mit einer beliebigen Zahl überein). - psusi
@psusi, ich denke, die Absicht ist auszuschließen . und .. aus dem Spiel. Es schließt jedoch auch (vollkommen legale) versteckte Dateinamen mit einem Zeichen wie z .a, .1 und so weiter. Vielleicht wäre ein besserer erweiterter Globus .!(|.) d. h. Literalpunkt, gefolgt von allem außer nichts oder einem anderen (einzelnen) Punkt, d.h. ls -d .!(|.) - steeldriver
@steeldriver, ordentlich, das ??? Version schließt "." und "..". Dies scheint das Ergebnis einer interessanten Eigenart zu sein: Weder? nor * wird einem Punkt entsprechen, aber der? muss passen etwas Andernfalls wird der Name ignoriert. - psusi
Um Verzeichnisse und Dateien zu identifizieren, fügen Sie die Option F hinzu, d. H., Ls -ldF.? * Verzeichnisnamen haben "/", wie die zuletzt angezeigten Zeichendateien nicht. - RCF
Das funktioniert fast, außer dass es auch versteckte Ordner wie .vim auflistet, was ich hier nicht als Datei ansehe. Ich modifiziere es ein bisschen wie ls -ldp.? * | grep -v / Dies listet nur versteckte Dateien auf, nicht versteckte Ordner - Fred Yang


ls -d .!(|.)

Genau das, wonach OP sucht.


28
2018-05-19 04:52



Wie funktioniert das? - SarcasticSully
Verzeichnis mit einem beliebigen Verzeichnis auflisten. und notieren Sie nichts ohne eins ist, was es ziemlich viel übersetzt. - patrick


Wenn Sie nur die Dateien in Ihrem aktuellen Verzeichnis (keine Rekursion) möchten, könnten Sie das tun

echo .[^.]*

Dadurch werden die Namen aller Dateien gedruckt, deren Name mit a beginnt . und es folgen ein oder mehrere Nicht-Punkt-Zeichen. Beachten Sie, dass dies bei Dateien fehlschlägt, deren Name mit aufeinanderfolgenden Punkten beginnt, also zum Beispiel ....foo wird nicht angezeigt.

Du könntest auch benutzen find:

find -mindepth 1 -prune -name '.*'

Das -mindepth stellt sicher, dass wir nicht übereinstimmen . und das -prune bedeutet, dass find wird nicht in Unterverzeichnisse absteigen.


13
2018-05-19 02:57





ls -ad .*

arbeitet für mich in Bash.


11
2018-05-19 04:55



Zeigt an . und .. in Bash - Penghe Geng


Verwenden find und awk,

find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

Erläuterung:

find . -type f -> Listet alle Dateien im aktuellen Verzeichnis zusammen mit dem Pfad auf,

./foo.html
./bar.html
./.foo1

awk -F"/" '$NF ~ /^\..*$/ {print $NF}' 

/ Als Feldtrenner überprüft awk das letzte Feld mit einem Punkt oder nicht. Wenn es mit einem Punkt beginnt, wird das letzte Feld der entsprechenden Zeile gedruckt.


4
2018-05-19 02:46



Du könntest es einfach benutzen find -type f. Sie müssen den Suchpfad nicht explizit angeben oder -name "*". - terdon♦


find ist normalerweise eine bessere Option für komplizierte Suchen als die Verwendung von globbing.

find . -mindepth 1 -maxdepth 1 -name '.*'

oder

find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'

find . Durchsucht das aktuelle Verzeichnis

-mindepth 1 schließt aus. und .. von der Liste

-maxdepth 1 beschränkt die Suche auf das aktuelle Verzeichnis

-name '.*' finde Dateinamen, die mit einem Punkt beginnen

-o oder

-name '*~' Dateinamen finden, die mit einer Tilde enden (normalerweise sind dies Sicherungsdateien aus Textbearbeitungsprogrammen)

Diese und alle anderen Antworten vermissen jedoch Dateien, die sich im aktuellen Verzeichnis befinden .hidden Datei. Wenn Sie ein Skript schreiben, lesen diese Zeilen die .hidden Datei und zeigen Sie die Dateinamen der vorhandenen an.

if [[ -f .hidden]] # if '.hidden' exists and is a file
then
    while read filename # read file name from line
    do
        if [[ -e "$filename" ]] # if the read file name exists
        then
            echo "$filename" # print it
        fi
    done < .hidden # read from .hidden file
fi

3
2018-05-19 21:24



Was ist das? .hidden Datei? Warum würde es jemals eine Datei namens? .hidden das enthält die Dateinamen? Wie auch immer, wenn es einen gibt, warum würdest du etwas so Komplexes tun, wenn alles, was du brauchst, wäre cat .hidden? Ihre find Befehl ist richtig (ish) aber der -name '*~' ist irrelevant. Dateien, die in Tilden enden, sind Sicherungsdateien, die jedoch in keiner Weise verborgen sind. - terdon♦
@terdon Die .hidden Datei ist für Dateien und Ordner, die Sie ausblenden möchten, wenn Sie den Datei- / Ordnernamen nicht ändern können, um mit einem Punkt zu beginnen. Wie für Dateien, die in Tilden enden, hängt es vom System ab. ls -B Solche Dateien werden ignoriert, ebenso wie die meisten GUI-Datei-Explorer. - Mark H
cat .hidden kann Dateien anzeigen, die nicht mehr vorhanden sind, wenn diese Dateien gelöscht oder verschoben wurden, seit sie der Datei hinzugefügt wurden .hidden Datei. - Mark H
Das funktioniert gut. - Penghe Geng


Ich denke, dass du es mit folgendem Befehl machen kannst.

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a Befehl, den Sie eingegeben haben, der alle Dateien und Verzeichnisse im aktuellen Arbeitsverzeichnis anzeigt.

grep "^\." Befehl Ich habe angehängt, das die Ausgabe filtert, um nur versteckte Dateien anzuzeigen (Sein Name beginnt mit ".").

grep -v "^\.$" | grep -v "^\..$" Befehl Ich habe angehängt, die Ausgabe filtert, um auszuschließen., .. (Sie sind aktuelle und übergeordnete Verzeichnis).

Wenn einige Dateinamen mehr als eine Zeile haben können "\n", das obige Beispiel könnte falsch sein.

Also schlage ich folgenden Befehl vor, um das Problem zu lösen.

find -maxdepth 1 -name ".[!.]*"

2
2018-05-19 02:00



Du solltest parsen Sie niemals die Ausgabe von ls. - Radu Rădeanu
@ RaduRădeanu Ich habe deinen Kommentar gesehen, es ist so gut. Ich habe meine Antwort erneut bearbeitet. Vielen Dank für Ihren Kommentar. - xiaodongjie


Was du sonst noch hättest tun können, is ls .?* Oder ls .!(|) Das zeigt dir alles im aktuellen Verzeichnis versteckte Dateien / Verzeichnisse oben und andere Dateien / Verzeichnisse unten

z. B. von meinem Terminal aus

$ ls .?*       
.bash_history    .dmrc        .macromedia   .weather
.bash_logout     .gksu.lock   .profile      .wgetrc
.bash_profile    .bashrc.save .ICEauthority .toprc           .Xauthority
.bashrc          .lastdir     .viminfo      .xsession-errors
.bashrc~         .dircolors   .lynxrc       .vimrc           .xsession-errors.old

..:
Baron

.adobe:
Flash_Player

.aptitude:
cache  config

.cache:
compizconfig-1                              rhythmbox
dconf                                       shotwell

Jetzt bemerken Sie in den obigen Ergebnissen, es zeigt Ihnen jede Datei / Verzeichnis mit seinem Unterverzeichnis und alle versteckten Dateien direkt darunter.

[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases  .bashrc1  .bashrc1~

..:
askapache-bash-profile.txt  examples.desktop             Public           top-1m.csv
backups             Firefox_wallpaper.png        PycharmProjects          top-1m.csv.zip
Desktop             java_error_in_PYCHARM_17581.log  Shotwell Import Log.txt  topsites.txt
Documents           Music                Templates            Videos
Downloads           Pictures                 texput.log           vmware

Entschuldigung, ich kann nichts sagen. um den Unterschied hier zu erklären ls .?* und @ cioby23 antworten ls -d .[!.]* .??* Und warum es eigentlich zwei Mal versteckte Dateien druckt, liegt daran, dass du buchstäblich zweimal fragst .??*, .?*, .[!.]* Sie sind dasselbe, also wird das Hinzufügen von zwei verschiedenen Befehlszeichen zweimal gedruckt.


2
2018-03-19 05:47