@ meuh yaklaşımı verimsizdir çünkü -maxdepth 1
yaklaşımı hala find
daha 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 2
bu olur:
find . \( ! -path './*/*' -o -prune \) -extra-conditions-and-actions
Ve burada geçersiz karakter sorunlarıyla karşılaşıyorsunuz.
Örneğin, denilen Stéphane
ancak é
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 find
uygulamaları) Eşleşmeyecek Stéphane
olarak *
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/Chazelas
olmadığı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ı find
ve çalıştırdığı herhangi bir uygulamayı ( -exec
tahminler 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 2
ama 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 find
rastgele yol argümanlarını ( -f
FreeBSD ile hariç) destekleyemeyen gerçeği geçici find
olarak çözer. değerleri $dir
gibi !
ya -print
...
-o
Olumsuzlama ile kombinasyon oluşan bağımsız iki takımın çalıştırmak için ortak bir hiledir -condition
/ ' -action
de find
.
-action1
Dosya toplantısında -condition1
ve bağımsız -action2
olarak dosya toplantısında çalıştırmak istiyorsanız -condition2
, şunları yapamazsınız:
find . -condition1 -action1 -condition2 -action2
-action2
Sadece 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 -action2
da 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 -action1
bir 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
-true
find
-links +0
-name '*'
-depth -2
,-depth 1
... yaklaşımı GNU'lardan daha iyi görülebilir-maxdepth
/-mindepth