Bu / current / dot klasörü “d” türünü bulma dışında bırakma


186
find . -type d

bir başlangıç ​​noktasının altındaki tüm dizinleri bulmak için kullanılabilir. Ancak .istenmeyen geçerli dizini ( ) de döndürür . Nasıl hariç tutulabilir?

Yanıtlar:


194

POSIX 7 çözümü :

find . ! -path . -type d

Bu özel durum için ( .), golf daha iyi mindepthçözüm (24 vs 26 karakter), ancak bu muhtemelen nedeniyle yazmak biraz daha zor !.

Diğer dizinleri hariç tutmak için, bu daha az iyi golf ve DRYness için bir değişken gerektirir:

D="long_name"
find "$D" ! -path "$D" -type d

Benim karar ağacı arasına !ve -mindepth:

  • senaryo? !Taşınabilirlik için kullanın .
  • GNU hakkında etkileşimli oturum?
    • Hariç tut .? Bozuk para atın.
    • Hariç tut long_name? Kullanın -mindepth.

Birden fazla yolu hariç tutmanız gerekiyorsa find /path/ ! -path "/path/first" ! -path "/path/second", bu tek yol mu?
Vincent De Smet

2
@VincentDeSmet, yalnızca bu yolları hariç tutmak mı yoksa gerçekte bunlara geri dönmek istemiyor musunuz? Sadece yollar varsa, find / ! -regex '/\(a\|b\)/.*'ya da daha basit bir şekilde grep ile boru oluşturabilirsiniz. Yinelememek için, yukarıdakiler çok verimsiz olacaktır ve şunu kullanmalısınız -prune: stackoverflow.com/questions/1489277/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

benim sorunum şöyle oldu: Ben 1 alt dizin dışında bir dizindeki her şeyi tekrar tekrar silmek istedim. Ben dizini hariç tutmak için findile kullanıyordum grepama üst dizin hala orada, her şey yine de silinmesine neden oldu.
Vincent De Smet

@VincentDeSmet Doğrudan bir çözüm göremiyorum find, önekleri kontrol etmeniz gerekir: stackoverflow.com/questions/17959317/… Ama döngü için bir Bash halledebilir :-)
Ciro Santilli 郝海东 冠状 病 六四 事件法轮功

Muhtemelen ünlem işaretinden ( \!) güvenli tarafta olmaktan kaçmak istersiniz . Makinemdeki tüm örnekler man findkaçtı, bu yüzden muhtemelen bir Good Idea ™ gibi görünüyor. Edit - Sadece açıkça açıkça diyor ki:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Adrian Günter

201

Sadece özyineleme derinliği parametre findtarafından kontrol edilemez -maxdepth, derinlik ilgili -mindepthparametre kullanılarak “üst” ten sınırlandırılabilir . Yani birinin ihtiyacı olan şey:

find . -mindepth 1 -type d

5
GNU bulmaya çalışır, ancak maalesef POSIX 7 bulmasının bir gnu uzantısıdır ve LSB bile POSIX kabuk yardımcı programlarını (GNU genişletilmiş olanlarını değil) kullanır
Ciro Santilli 10: 冠状 病 六四 事件 法轮功

6
Bu benim için çalıştı. Yani:find . -mindepth 1 -maxdepth 1 -type d ...
racl101

19

Kullandığım find ./* <...>ben (birinci düzey dotfiles görmezden umursamıyorum zaman *glob bash varsayılan olarak bu eşleşmiyor - shopt yerleşiğinin içinde 'dotglob' seçeneğini bkz: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).

eclipse tmp # bul.
.
./ekran
./screen/.testfile2
./.X11-unix
./.ICE-unix
./tmux-0
./tmux-0/default
eclipse tmp # find ./*
./ekran
./screen/.testfile2
./tmux-0
./tmux-0/default

Bilginize. bu hile -execseçeneği ile kullanmayın . Örneğin, denerseniz find dir/* -type d -exec rmdir {} \;, hatalar görürsünüz.
plhn

Yanılıyorsunuz ya da yanlış yönlendirilmişsinizdir. Bu komut işe yarayacak. Hatalar görüyorsanız, bunlar geliyor olacak rmdirve büyük olasılıkla dizinlerin boş olmadığını söylüyorlar, çünkü dizinlerde findderinlemesine bir arama yapacak ve ebeveynleri çocuklarından önce gösterecektir.
Milos Ivanovic

2
Not: "birinci düzey nokta dosyalarını yoksaymak" aynı zamanda tüm gizli dosyaları / dizinleri hariç tutmak anlamına gelir.
Jonathan H

2

Peki, basit bir çözüm de (çözüm benim için git git bash'da çalışmıyordu)

find * -type d

Çok performanslı olmayabilir, ancak işi yapar ve bazen ihtiyacımız olan şey budur.

[Düzenle]: @AlexanderMills'in açıkladığı gibi, kök konumda ./.hiddengizli dizinleri göstermez (örn. ./folder/.hiddenSub) , Ancak gizli alt dizinleri gösterir (örn. ). [Pencerelerde git bash ile test edildi]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.