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?
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:
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:
!Taşınabilirlik için kullanın ..? Bozuk para atın.long_name? Kullanın -mindepth.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/…
findile kullanıyordum grepama üst dizin hala orada, her şey yine de silinmesine neden oldu.
find, önekleri kontrol etmeniz gerekir: stackoverflow.com/questions/17959317/… Ama döngü için bir Bash halledebilir :-)
\!) 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.
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
find . -mindepth 1 -maxdepth 1 -type d ...
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
-execseçeneği ile kullanmayın . Örneğin, denerseniz find dir/* -type d -exec rmdir {} \;, hatalar görürsünüz.
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.
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]
find /path/ ! -path "/path/first" ! -path "/path/second", bu tek yol mu?