Dateien aus versteckten Verzeichnissen, aber nicht versteckte Dateien (unter nicht versteckten Verzeichnissen) von den Suchergebnissen ausschließen

Dateien aus versteckten Verzeichnissen, aber nicht versteckte Dateien (unter nicht versteckten Verzeichnissen) von den Suchergebnissen ausschließen

Gegeben sei die folgende Verzeichnisstruktur:

$ tree --noreport dir

dir
├── fileA
├── .hiddenfileA
├── .hiddendirA
|   ├── .hiddenfileB
│   ├── fileC
│   └── fileD
└── dirA
    ├── .hiddenfileC
    ├── fileE
    └── fileF

Voraussetzung ist ein Aufruf von find, sodass Dateien aus versteckten Verzeichnissen, jedoch nicht versteckte Dateien (unter nicht versteckten Verzeichnissen) vom Ergebnis ausgeschlossen werden.

Die erwartete Rendite sollte ungefähr so ​​aussehen:

./.hiddenfileA
./dirA/.hiddenfileC
./dirA/fileE
./dirA/fileF
./fileA

Habe ein bisschen recherchiert und herausgefundenHierInformationen, die mich dazu veranlasst haben, den folgenden Aufruf zu erstellen, umfind

$ find . -type f -not -path '*/\.*' -print

Diese Lösung hat jedoch den Nachteil, dass versteckte Verzeichnisse übersprungen werdenund Dateien.

Antwort1

Bereinigen Sie versteckte Verzeichnisse und beschränken Sie die Ergebnisse auf Dateien:

find . -type d -name '.?*' -prune -o -type f -print

Wie vorgeschlagen vonAbonnieren, möchten Sie vielleicht Verzeichnisse herausfiltern, was dazu führen würde, dass Dateien, Links usw. angezeigt werden:

find . -type d -name '.?*' -prune -o ! -type d -print

Antwort2

Der Befehl, den Sie haben, funktioniert fast. Verwenden Sie

find . -type f ! -path '*/.*/*' -print
  • Das Pfadmuster */.*/*sucht nach einem /. (was einen Segmentnamen impliziert, der mit beginnt.) gefolgt(letztlich)vona  / — also der Segmentname, der mit beginnt. darf nicht das letzte sein (der Dateiname); es muss also ein Verzeichnisname sein.
  • -pathverwendet Dateinamenerweiterungsmuster; auch bekannt als Globs oder Platzhalter. Sie müssen also nicht \vor ..
  • Nicht verwenden -not, wenn Sie Portabilität auf Nicht-GNU-Systeme wünschen. Die Verwendung von  ! zur Darstellung von „nicht“ ist in POSIX festgelegt und funktioniert in jeder Version von find (sogar BSD, Solaris usw. und alten Systemen).

verwandte Informationen