Cara mengecualikan folder ini / saat ini / dot dari menemukan "ketik d"

186
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?

Matthias Ronge
sumber

Jawaban:

194

Solusi POSIX 7 :

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:

  • naskah? Gunakan !untuk portabilitas.
  • sesi interaktif tentang GNU?
    • tidak termasuk .? Lempar koin.
    • tidak termasuk long_name? Gunakan -mindepth.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
jika Anda perlu mengecualikan beberapa jalur, lakukan find /path/ ! -path "/path/first" ! -path "/path/second"apakah ini satu-satunya cara?
Vincent De Smet
2
@VincentDeSmet Anda ingin mengecualikan hanya jalur tersebut, atau sebenarnya tidak berulang ke dalamnya? Jika hanya jalur, Anda dapat menggunakan 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/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件 法轮功
Masalah saya adalah sebagai berikut: Saya ingin menghapus semuanya secara rekursif dalam suatu direktori kecuali untuk 1 sub direktori. Saya menggunakan finddengan grepuntuk mengecualikan direktori tetapi direktori induk masih ada, menyebabkan semuanya terhapus pula.
Vincent De Smet
@VincentDeSmet Saya tidak melihat solusi langsung dengan find, Anda harus memeriksa awalan: stackoverflow.com/questions/17959317/... Tapi Bash for loop dapat mengatasinya :-)
Ciro Santilli 郝海东 冠状 病 六四 事件法轮功
Anda mungkin ingin menghindari tanda seru char ( \!) 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.
Adrian Günter
201

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
Matthias Ronge
sumber
5
bekerja pada GNU menemukan, tapi sayangnya adalah ekstensi gnu ke POSIX 7 menemukan , dan bahkan LSB menggunakan POSIX shell utilitas (tidak GNU diperpanjang yang)
Ciro Santilli郝海东冠状病六四事件法轮功
6
Ini berhasil untuk saya. Yaitu:find . -mindepth 1 -maxdepth 1 -type d ...
racl101
19

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
Milos Ivanovic
sumber
FYI. jangan gunakan trik ini dengan -execopsi. Misalnya, jika Anda mencoba find dir/* -type d -exec rmdir {} \;, Anda akan melihat kesalahan.
plhn
Anda salah, atau mungkin salah arah. Perintah itu akan bekerja dengan baik. Jika Anda melihat kesalahan, mereka akan datang dari 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.
Milos Ivanovic
2
Catatan: "mengabaikan dotfile tingkat pertama" juga berarti mengecualikan semua file / direktori tersembunyi.
Jonathan H
2

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]

StackHola
sumber