find . -type d
dapat digunakan untuk menemukan semua direktori di bawah ini beberapa titik awal. Tetapi ia mengembalikan direktori saat ini ( .
) juga, yang mungkin tidak diinginkan. Bagaimana bisa dikecualikan?
find . ! -path . -type d
Untuk kasus khusus ini ( .
), golf lebih baik daripada mindepth
solusi (24 vs 26 karakter), meskipun ini mungkin sedikit lebih sulit untuk diketik karena!
.
Untuk mengecualikan direktori lain, ini akan golf kurang baik dan memerlukan variabel untuk KERING:
D="long_name"
find "$D" ! -path "$D" -type d
Pohon keputusan saya antara !
dan -mindepth
:
!
untuk portabilitas..
? Lempar koin.long_name
? Gunakan -mindepth
.
find /path/ ! -path "/path/first" ! -path "/path/second"
apakah ini satu-satunya cara?find / ! -regex '/\(a\|b\)/.*'
atau lebih sederhana, pipa melalui grep. Agar tidak berulang, hal di atas akan sangat tidak efisien dan Anda harus menggunakan-prune
: stackoverflow.com/questions/1489277/…find
dengangrep
untuk mengecualikan direktori tetapi direktori induk masih ada, menyebabkan semuanya terhapus pula.find
, Anda harus memeriksa awalan: stackoverflow.com/questions/17959317/... Tapi Bash for loop dapat mengatasinya :-)\!
) agar berada di sisi yang aman. Semua contoh di mesin sayaman find
telah lolos sehingga sepertinya itu mungkin Ide yang Baik ™. Sunting - Hanya menyadarinya bahkan secara eksplisit mengatakan:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Tidak hanya kedalaman rekursi yang
find
dapat dikontrol oleh-maxdepth
parameter, kedalaman juga dapat dibatasi dari "atas" menggunakan-mindepth
parameter yang sesuai . Jadi yang sebenarnya dibutuhkan adalah:sumber
find . -mindepth 1 -maxdepth 1 -type d ...
Saya menggunakan
find ./* <...>
ketika saya tidak keberatan mengabaikan dotfile tingkat pertama (*
glob tidak cocok dengan ini secara default di bash - lihat opsi 'dotglob' di shopt builtin: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).sumber
-exec
opsi. Misalnya, jika Anda mencobafind dir/* -type d -exec rmdir {} \;
, Anda akan melihat kesalahan.rmdir
dan kemungkinan besar memberi tahu Anda bahwa direktori tidak kosong karenafind
akan melakukan pencarian mendalam-pertama ke direktori, menunjukkan orang tua di depan anak-anak mereka.Nah, solusi sederhana juga (solusinya tidak bekerja untuk saya di windows git bash)
find * -type d
Ini mungkin tidak terlalu berkinerja, tetapi menyelesaikan pekerjaan, dan itulah yang kadang-kadang kita butuhkan.
[Sunting]: Seperti yang dikomentari @AlexanderMills itu tidak akan menampilkan direktori tersembunyi di lokasi root (misalnya
./.hidden
), tetapi itu akan menampilkan subdirektori tersembunyi (mis../folder/.hiddenSub
). [Diuji dengan git bash di windows]sumber