Baru-baru ini saya perhatikan bahwa spesifikasi POSIX untukfind
tidak termasuk yang -maxdepth
utama.
Bagi mereka yang tidak terbiasa dengan itu, tujuan -maxdepth
utama adalah untuk membatasi berapa banyak level yang find
akan turun. hanya-maxdepth 0
menghasilkan argumen baris perintah yang sedang diproses; hanya akan menangani hasil secara langsung dalam argumen baris perintah, dll.-maxdepth 1
Bagaimana saya bisa mendapatkan perilaku yang setara dengan -maxdepth
primer non-POSIX menggunakan hanya opsi dan alat yang ditentukan POSIX?
(Catatan: Tentu saja saya bisa mendapatkan yang setara -maxdepth 0
dengan hanya menggunakan -prune
sebagai operan pertama, tetapi itu tidak meluas ke kedalaman lain.)
-depth -2
,-depth 1
... pendekatan bisa dilihat sebagai lebih baik dari GNU-maxdepth
/-mindepth
-maxdepth
/-mindepth
, ada alternatif yang masuk akal (perhatikan bahwa-path
ini adalah tambahan terbaru untuk POSIX). Alternatif untuk-timexy
atau-mtime -3m
(atau-mmin -3
) jauh lebih rumit. Beberapa suka-execdir
/-delete
tidak punya alternatif yang dapat diandalkan.Jawaban:
Anda dapat menggunakan
-path
untuk mencocokkan kedalaman yang diberikan dan memangkas di sana. Misalnyaakan menjadi maxdepth 1, karena
*
cocok dengan.
,*/*
cocok./dir1
, dan*/*/*
cocok./dir1/dir2
yang dipangkas. Jika Anda menggunakan direktori awal mutlak Anda perlu menambahkan terkemuka/
untuk-path
juga.sumber
/*
ujung pola, mengambil-o
operator, dan mendapatkan hasil yang sama?*
cocok/
juga, jadi dira/b/c/d/e
akan pas-path */*
, sedih.a/b/c/d/e
tidak akan pernah tercapai , karena-prune
akan diterapkan padaa/b
....-prune
dan-o
dihapus. Jika Anda menjaga-prune
masalahnya adalah bahwa*/*
tidak akan cocok dengan apa pun pada tingkat di atas maxdepth, misalnya direktori tunggala
.@ meuh's pendekatan tidak efisien karena
-maxdepth 1
pendekatannya masih memungkinkanfind
membaca isi direktori di level 1 untuk kemudian mengabaikannya sebaliknya. Ini juga tidak akan berfungsi dengan baik dengan beberapafind
implementasi (termasuk GNUfind
) jika beberapa nama direktori mengandung urutan byte yang tidak membentuk karakter yang valid di lokal pengguna (seperti untuk nama file dalam pengkodean karakter yang berbeda).adalah cara yang lebih kanonik untuk mengimplementasikan GNU
-maxdepth 1
(atau FreeBSD-depth -2
).Meskipun demikian, umumnya
-depth 1
Anda ingin (-mindepth 1 -maxdepth 1
) karena Anda tidak ingin mempertimbangkan.
(kedalaman 0), dan kemudian lebih sederhana:Sebab
-maxdepth 2
, itu menjadi:Dan di situlah Anda menjalankan masalah karakter yang tidak valid.
Sebagai contoh, jika Anda memiliki direktori bernama
Stéphane
tetapi yangé
dikodekan dalam iso8859-1 (alias latin1) charset (0xe9 byte) seperti yang paling umum di Eropa Barat dan Amerika hingga pertengahan 2000-an, maka 0xe9 byte bukan merupakan karakter yang valid dalam UTF-8. Jadi, di lokal UTF-8,*
wildcard (dengan beberapafind
implementasi) tidak akan cocokStéphane
dengan*
0 karakter atau lebih dan 0xe9 bukan karakter.My
find
(ketika output masuk ke terminal) menampilkan byte 0xe9 yang tidak valid seperti di?
atas. Anda dapat melihat bahwaSt<0xe9>phane/Chazelas
itu bukanprune
d.Anda dapat mengatasinya dengan melakukan:
Tetapi perhatikan bahwa itu memengaruhi semua pengaturan lokal
find
dan aplikasi apa pun yang dijalankannya (seperti melalui-exec
predikat).Sekarang, saya benar-benar mendapatkan
-maxdepth 2
tetapi perhatikan bagaimana é di Stéphane kedua yang dikodekan dengan benar dalam UTF-8 ditampilkan sebagai??
0xc3 0xa9 byte (dianggap sebagai dua karakter individu yang tidak terdefinisi di C locale) dari pengkodean UTF-8 dari é. tidak dapat dicetak karakter di lokal C.Dan jika saya telah menambahkan
-name '????????'
, saya akan mendapatkan Stéphane yang salah (yang dikodekan dalam iso8859-1).Untuk menerapkan jalur yang berubah-ubah
.
, Anda harus:untuk
-mindepth 1 -maxdepth 1
atau:untuk
-maxdepth 2
.Saya masih akan melakukan:
Pertama karena itu membuat jalur lebih pendek yang membuatnya kurang mungkin berjalan ke jalur terlalu lama atau daftar arg masalah terlalu lama tetapi juga untuk bekerja di sekitar fakta yang
find
tidak dapat mendukung argumen jalur sewenang-wenang (kecuali-f
dengan FreeBSDfind
) karena akan tersedak nilai$dir
suka!
atau-print
...The
-o
dalam kombinasi dengan negasi adalah trik umum untuk menjalankan dua set independen-condition
/-action
difind
.Jika Anda ingin menjalankan
-action1
rapat file-condition1
dan secara mandiri-action2
rapat file-condition2
, Anda tidak bisa melakukan:Seperti
-action2
hanya akan dijalankan untuk file yang memenuhi kedua kondisi.Maupun:
Karena
-action2
tidak akan dijalankan untuk file yang memenuhi kedua kondisi tersebut.berfungsi seperti yang
\( ! -condition1 -o -action1 \)
akan diselesaikan dengan true untuk setiap file. Itu mengasumsikan-action1
adalah tindakan (seperti-prune
,-exec ... {} +
) yang selalu mengembalikan true . Untuk tindakan seperti-exec ... \;
itu dapat mengembalikan false , Anda mungkin ingin menambahkan-o -something
tempat lain-something
yang tidak berbahaya tetapi mengembalikan true seperti-true
di GNUfind
atau-links +0
atau-name '*'
(meskipun perhatikan masalah tentang karakter yang tidak valid di atas).sumber
Saya mengalami masalah di mana saya perlu cara untuk membatasi kedalaman saat mencari beberapa jalur (bukan hanya
.
).Sebagai contoh:
Ini membawa saya ke pendekatan alternatif menggunakan -regex. Intinya adalah:
Jadi, yang di atas adalah:
Tanpa nama file:
Akhirnya, untuk
-maxdepth 2
perubahan regex ke:'(dir1|dir2)/([^/]*/){0,1}[^/]*$'
sumber
-maxdepth
akan berfungsi dengan beberapa jalur pencarian.