gegeben die folgende Struktur:
oz123@debian:~/ $ tree .
.
├── a
│ ├── a1
│ ├── a2
│ └── a3
├── a1
│ ├── a11
│ ├── a12
│ └── a31
├── b
│ └── b1
│ ├── b11
│ │ └── b21
│ │ └── b31
│ ├── b12
│ └── b3
└── c
16 directories, 0 files
Wie finde ich alle Endknoten?
Ich habe die folgenden Lösungen gefunden, die gut zu sein scheinen , aber ich muss beweisen, dass es keinen Testfall gibt, der fehlschlägt.
Die Hilfeseite der -links
Staaten:
Sie können auch mit '-links' nach Dateien suchen, die eine bestimmte Anzahl von Links haben. Verzeichnisse haben normalerweise mindestens zwei feste Verbindungen. ihr . Eintrag ist der zweite. Wenn sie Unterverzeichnisse haben, hat jedes von diesen auch einen festen Link namens .. zu seinem übergeordneten Verzeichnis. Das . und .. Verzeichniseinträge werden normalerweise nicht durchsucht, es sei denn, sie werden in der Befehlszeile find angegeben.
mögliche Lösung:
oz123@debian:~/ $ find . -type d -links 2
./a/a2
./a/a3
./a/a1
./c
./a1/a31
./a1/a11
./a1/a12
./b/b1/b12
./b/b1/b3
./b/b1/b11/b21/b31
- Kann jemand eine bessere Lösung anbieten (ohne Verwendung von Rohren und Sed, dies ist performant ...)
- Funktioniert es auf jedem Dateisystem?
command-line
find
file-search
Oz123
quelle
quelle
-links 2
Trick finden. Es wird nicht funktionierenbtrfs
.Antworten:
Als Ergänzung zu Ihrer eigenen Lösung mit
-links
möchte ich nur hinzufügen, dass es auf Dateisystemen, die nicht der Unix-Verzeichnisverknüpfungskonvention entsprechen, nicht funktioniert. Ab dieserman find
Option-noleaf
sind dies mindestens CD-ROM, MS-DOS-Dateisysteme und AFS-Volume-Mount-Punkte.Als Referenz wurde diese Frage bereits mit verschiedenen Lösungen diskutiert, die in der Tat langsamer sind und normalerweise auf Rohrleitungen zu sed / awk und ähnlichem zurückgreifen.
quelle
Es gibt eine etwas offensichtlichere Option
-empty
:upd. Ok, Sie haben Recht, auf diese Weise funktioniert es nicht mit Dateien in Verzeichnissen.
Hier handelt es sich also um eine nicht verlässliche Version eines festen Dateisystems:
quelle
find . -type d -links 2
funktioniert auf den meisten Dateisystemen, aber nicht auf allen. Ich glaube, es gibt keine andere Möglichkeit zu wissen, als zu wissen, welche Dateisystemtypen die Eigenschaft haben, dass Verzeichnisse einen Link zu sich selbst enthalten. GNU find erkennt dies dynamisch (wenn etwas über "Automatisch die Option -noleaf von find aktivieren" ausgegeben wird, wissen Sie, dass Ihr Dateisystem diese Eigenschaft nicht hat). Die meisten gängigen Dateisystemtypen sind in Ordnung, jedoch nicht FAT oder btrfs.Wenn Sie sicher sein möchten, müssen Sie jedes Verzeichnis testen. Eine Möglichkeit, dies zu tun, besteht darin,
find
für jedes Unterverzeichnis erneut aufzurufen .(mit GNU
find
, können Sie ersetzen-prune
mit-print -quit
, um es ein bisschen effizienter).Eine andere Möglichkeit besteht darin, die Ausgabe von nachzubearbeiten
find
. Mitfind -depth
ist ein Blattverzeichnis eines, das keinem Unterverzeichnis von sich selbst folgt.quelle
Probieren Sie die folgende Lösung aus (sollte Linux-, Unix- und OS X-kompatibel sein):
Es ist ein ähnlicher Ansatz wie bei einer Eillösung , jedoch ohne Rohre.
quelle