diberikan struktur berikut:
oz123@debian:~/ $ tree .
.
├── a
│ ├── a1
│ ├── a2
│ └── a3
├── a1
│ ├── a11
│ ├── a12
│ └── a31
├── b
│ └── b1
│ ├── b11
│ │ └── b21
│ │ └── b31
│ ├── b12
│ └── b3
└── c
16 directories, 0 files
Bagaimana cara menemukan semua node akhir?
Saya menemukan solusi berikut yang tampaknya baik, tetapi saya harus membuktikan bahwa tidak ada test case yang akan gagal.
Halaman bantuan -links
negara:
Anda juga dapat mencari file yang memiliki jumlah tautan tertentu, dengan '-links'. Direktori biasanya memiliki setidaknya dua tautan keras; mereka. entri adalah yang kedua. Jika mereka memiliki subdirektori, masing-masing dari mereka juga memiliki tautan keras yang disebut .. ke direktori induknya. . dan .. entri direktori biasanya tidak dicari kecuali disebutkan pada baris perintah find.
solusi yang mungkin:
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
- Adakah yang bisa memberikan solusi yang lebih baik (tanpa menggunakan pipa dan sed, ini telah menjadi pemain ...)
- Apakah ini akan berfungsi pada sistem file apa saja?
command-line
find
file-search
Oz123
sumber
sumber
-links 2
triknya. Itu tidak akan berhasilbtrfs
.Jawaban:
Sebagai tambahan untuk solusi Anda sendiri
-links
, saya hanya ingin menambahkan bahwa itu tidak akan berfungsi pada sistem file yang tidak mengikuti konvensi direktori-link Unix. Dariman find
pada opsi-noleaf
ini setidaknya CD-ROM, sistem file MS-DOS dan titik pemasangan volume AFS.Untuk referensi, pertanyaan ini sudah dibahas dengan berbagai solusi yang memang lebih lambat dan biasanya menggunakan perpipaan ke sed / awk dan serupa.
sumber
Ada opsi yang sedikit lebih jelas
-empty
:upd. Oke, Anda benar cara ini tidak akan berfungsi dengan file dalam dir.
Jadi di sini ini adalah sistem file tetap versi undependable:
sumber
find . -type d -links 2
bekerja pada sebagian besar sistem file, tetapi tidak semua. Saya tidak berpikir ada cara untuk mengetahui selain mengetahui tipe sistem file mana yang memiliki properti yang mengandung direktori untuk tautannya sendiri. GNU find mendeteksi ini secara dinamis (jika ia mencetak sesuatu tentang "Secara otomatis mengaktifkan opsi find -noleaf", Anda tahu sistem file Anda tidak memiliki properti ini). Jenis sistem file yang paling umum adalah ok, tetapi tidak FAT atau btrfs.Jika Anda ingin memastikan, Anda harus menguji setiap direktori. Salah satu cara untuk melakukan ini adalah memohon
find
lagi untuk setiap subdirektori.(dengan GNU
find
, Anda dapat menggantinya-prune
dengan-print -quit
membuatnya sedikit lebih efisien).Cara lain adalah dengan pasca proses output
find
. Denganfind -depth
, direktori daun adalah direktori yang tidak mengikuti subdirektori itu sendiri.sumber
Coba solusi berikut (harus kompatibel dengan Linux, Unix dan OS X):
Ini pendekatan yang mirip dengan solusi tergesa - gesa , tetapi tanpa pipa.
sumber