@ meuh yaklaşımı verimsizdir çünkü -maxdepth 1yaklaşımı hala finddaha sonra onları görmezden gelmek için seviye 1'deki dizinlerin içeriğini okumasına izin verir . Bazı dizin adları, kullanıcının yerel ayarında geçerli karakterler oluşturmayan bayt dizileri içeriyorsa find(GNU dahil find) bazı uygulamalarla da düzgün çalışmaz ( farklı bir karakter kodlamasındaki dosya adları gibi).
find . \( -name . -o -prune \) -extra-conditions-and-actions
GNU'ları -maxdepth 1(veya FreeBSD'leri -depth -2) uygulamanın daha kanonik yoludur .
Genel olarak, dikkate almak istemediğiniz gibi -depth 1( -mindepth 1 -maxdepth 1) .(derinlik 0) istediğiniz ( ) ve daha da basit:
find . ! -name . -prune -extra-conditions-and-actions
Çünkü -maxdepth 2bu olur:
find . \( ! -path './*/*' -o -prune \) -extra-conditions-and-actions
Ve burada geçersiz karakter sorunlarıyla karşılaşıyorsunuz.
Örneğin, denilen Stéphaneancak é2000'lerin ortalarına kadar Batı Avrupa ve Amerika'da en yaygın olan iso8859-1 (latin1) karakter kümesinde (0xe9 bayt) kodlanmış bir dizininiz varsa , 0xe9 baytı bir UTF-8'de geçerli karakter. Yani, UTF-8 yerellerde, *(bazı joker finduygulamaları) Eşleşmeyecek Stéphaneolarak *0 veya daha fazla karakter ve karakter 0xe9 değildir.
$ locale charmap
UTF-8
$ find . -maxdepth 2
.
./St?phane
./St?phane/Chazelas
./Stéphane
./Stéphane/Chazelas
./John
./John/Smith
$ find . \( ! -path './*/*' -o -prune \)
.
./St?phane
./St?phane/Chazelas
./St?phane/Chazelas/age
./St?phane/Chazelas/gender
./St?phane/Chazelas/address
./Stéphane
./Stéphane/Chazelas
./John
./John/Smith
My find(çıkış bir terminale gittiğinde) ?yukarıdaki gibi geçersiz 0xe9 baytını görüntüler . Bunun d St<0xe9>phane/Chazelasolmadığını görebilirsiniz prune.
Yaparak bunun etrafında çalışabilirsiniz:
LC_ALL=C find . \( ! -path './*/*' -o -prune \) -extra-conditions-and-actions
Ancak bunun tüm yerel ayarları findve çalıştırdığı herhangi bir uygulamayı ( -exectahminler gibi ) etkilediğini unutmayın .
$ LC_ALL=C find . \( ! -path './*/*' -o -prune \)
.
./St?phane
./St?phane/Chazelas
./St??phane
./St??phane/Chazelas
./John
./John/Smith
Şimdi, gerçekten olsun -maxdepth 2ama UTF-8 düzgün şekilde kodlanmış ikinci Stéphane é nasıl ??UTF-8 kodlama UTF-8 kodlama 0xc3 0xa9 bayt (C yerel iki tanımlanmamış karakter olarak kabul edilir) olarak görüntülendiğini not C yerel ayarında yazdırılamaz karakterler.
Ve eğer bir -name '????????'ekleseydim, yanlış Stéphane (iso8859-1 ile kodlanmış olan) almış olurdum.
Bunun yerine rastgele yollara başvurmak için .şunları yaparsınız:
find some/dir/. ! -name . -prune ...
için -mindepth 1 -maxdepth 1:
find some/dir/. \( ! -path '*/./*/*' -o -prune \) ...
için -maxdepth 2.
Yine de şunu yapardım:
(cd -P -- "$dir" && find . ...)
Birincisi, bu, yolları daha kısa hale getirir, bu da çok uzun veya arg listesinin çok uzun sorunlara yol açmasını daha az hale getirir, ancak aynı zamanda boğulma olacağı için findrastgele yol argümanlarını ( -fFreeBSD ile hariç) destekleyemeyen gerçeği geçici findolarak çözer. değerleri $dirgibi !ya -print...
-oOlumsuzlama ile kombinasyon oluşan bağımsız iki takımın çalıştırmak için ortak bir hiledir -condition/ ' -actionde find.
-action1Dosya toplantısında -condition1ve bağımsız -action2olarak dosya toplantısında çalıştırmak istiyorsanız -condition2, şunları yapamazsınız:
find . -condition1 -action1 -condition2 -action2
-action2Sadece her iki koşulu da karşılayan dosyalar için çalıştırılacağı gibi .
Nor:
find . -contition1 -action1 -o -condition2 -action2
Her iki koşulu -action2da karşılayan dosyalar için çalıştırılmaz .
find . \( ! -condition1 -o -action1 \) -condition2 -action2
her dosya \( ! -condition1 -o -action1 \)için true olarak çözüleceği gibi çalışır . Yani varsayar -action1bir eylem (gibidir -prune, -exec ... {} +her zaman döner) doğrudur . Bunun gibi eylemler yanlış-exec ... \; döndürülebilirse , zararsız olan ancak GNU veya veya gibi doğru olan başka bir yer eklemek isteyebilirsiniz (yine de yukarıdaki geçersiz karakterler ile ilgili sorunu not edin).-o -something-something-truefind-links +0-name '*'
-depth -2,-depth 1... yaklaşımı GNU'lardan daha iyi görülebilir-maxdepth/-mindepth