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 . -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?
Jawaban:
find . ! -path . -type d
Untuk kasus khusus ini ( .), golf lebih baik daripada mindepthsolusi (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 / ! -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/…
finddengan grepuntuk 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 saya man findtelah 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 finddapat dikontrol oleh -maxdepthparameter, kedalaman juga dapat dibatasi dari "atas" menggunakan -mindepthparameter yang sesuai . Jadi yang sebenarnya dibutuhkan adalah:
find . -mindepth 1 -type d
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 ).
eclipse tmp # find. . ./layar ./screen/.testfile2 ./.X11-unix ./.ICE-unix ./tmux-0 ./tmux-0/default
eclipse tmp # find ./* ./layar ./screen/.testfile2 ./tmux-0 ./tmux-0/default
-execopsi. Misalnya, jika Anda mencoba find dir/* -type d -exec rmdir {} \;, Anda akan melihat kesalahan.
rmdirdan kemungkinan besar memberi tahu Anda bahwa direktori tidak kosong karena findakan 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]
find /path/ ! -path "/path/first" ! -path "/path/second"apakah ini satu-satunya cara?