biorąc pod uwagę następującą strukturę:
oz123@debian:~/ $ tree .
.
├── a
│ ├── a1
│ ├── a2
│ └── a3
├── a1
│ ├── a11
│ ├── a12
│ └── a31
├── b
│ └── b1
│ ├── b11
│ │ └── b21
│ │ └── b31
│ ├── b12
│ └── b3
└── c
16 directories, 0 files
Jak znaleźć wszystkie węzły końcowe?
Znalazłem następujące rozwiązania, które wydają się dobre, ale muszę udowodnić, że nie ma przypadku testowego, który by go zawiódł.
Strona pomocy -links
stanów:
Możesz także wyszukiwać pliki, które mają określoną liczbę linków, za pomocą „-links”. Katalogi zwykle mają co najmniej dwa twarde linki; ich . wejście jest drugie. Jeśli mają podkatalogi, każdy z nich ma również stałe łącze o nazwie .. do swojego katalogu nadrzędnego. The. i .. pozycje katalogu zwykle nie są przeszukiwane, chyba że są wymienione w wierszu polecenia find.
możliwe rozwiązanie:
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
- Czy ktoś może zapewnić lepsze rozwiązanie (bez użycia rur i sed, to musi być wydajne ...)
- Czy będzie działać na dowolnym systemie plików?
command-line
find
file-search
Oz123
źródło
źródło
-links 2
sztuczka. To nie zadziałabtrfs
.Odpowiedzi:
Jako dodatek do twojego własnego rozwiązania
-links
, chcę tylko dodać, że nie będzie działać na systemach plików, które nie są zgodne z konwencją uniksowego łącza do katalogu. Z tejman find
opcji-noleaf
są to przynajmniej CD-ROM, systemy plików MS-DOS i punkty montowania woluminów AFS.Dla porównania, to pytanie zostało już omówione z różnymi rozwiązaniami, które są rzeczywiście wolniejsze i zwykle uciekają się do potokowania do sed / awk i podobnych.
źródło
Istnieje nieco bardziej oczywista opcja
-empty
:aktualiz. Ok, masz rację, w ten sposób nie będzie działać z plikami w katalogach.
Oto wersja niezmiennego systemu plików:
źródło
find . -type d -links 2
działa na większości systemów plików, ale nie na wszystkich. Nie sądzę, że istnieje inny sposób, niż wiedzieć, które typy systemów plików mają właściwość polegającą na tym, że katalogi zawierają odsyłacze do siebie. GNU find wykrywa to dynamicznie (jeśli wypisuje coś o „Automatycznym włączaniu opcji find -noleaf”, wiesz, że twój system plików nie ma tej właściwości). Najpopularniejsze typy systemów plików są w porządku, ale nie FAT i btrfs.Jeśli chcesz się upewnić, będziesz musiał przetestować każdy katalog. Jednym ze sposobów na to jest
find
ponowne wywołanie dla każdego podkatalogu.(z GNU
find
, można zastąpić-prune
z-print -quit
aby uczynić go nieco bardziej wydajne).Innym sposobem jest przetworzenie wyniku
find
. Zafind -depth
pomocą katalogu typu liść nie znajduje się sam podkatalog.źródło
Wypróbuj następujące rozwiązanie (powinno być kompatybilne z Linux, Unix i OS X):
Jest to podobne podejście do rozwiązania szczytu , ale bez żadnych rur.
źródło