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 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 / ! -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
dengan grep
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 saya man 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:
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
-exec
opsi. Misalnya, jika Anda mencoba find dir/* -type d -exec rmdir {} \;
, Anda akan melihat kesalahan.
rmdir
dan kemungkinan besar memberi tahu Anda bahwa direktori tidak kosong karena find
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]
find /path/ ! -path "/path/first" ! -path "/path/second"
apakah ini satu-satunya cara?