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. -path
verwendet 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 vonfind
(sogar BSD, Solaris usw. und alten Systemen).