これ/現在/ドットフォルダーを「タイプd」の検索から除外する方法


186
find . -type d

開始点より下のすべてのディレクトリを見つけるために使用できます。ただし、現在のディレクトリ(.)も返すため、望ましくない場合があります。どうすれば除外できますか?

回答:


194

POSIX 7ソリューション

find . ! -path . -type d

この特定のケース(.)では、mindepthソリューションよりもゴルフの方が優れています(24文字と26文字)。ただし、!

他のディレクトリを除外するために、これはゴルフがうまくいかなくなり、DRYnessの変数を必要とします:

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

!との間の私の決定木-mindepth

  • 脚本?!移植性のために使用します。
  • GNUのインタラクティブセッション?
    • 除外し.ますか?コインを投げます。
    • 除外しlong_nameますか?を使用し-mindepthます。

複数のパスを除外する必要がある場合find /path/ ! -path "/path/first" ! -path "/path/second"は、これが唯一の方法ですか?
Vincent De Smet 2015

2
@VincentDeSmetこれらのパスだけを除外しますか、それとも実際にそれらに再帰しませんか?パスだけの場合はfind / ! -regex '/\(a\|b\)/.*'、より簡単に、grepを使用してパイプできます。再帰、上記の非常に効率が悪いではないために、あなたが使用する必要があります-prunestackoverflow.com/questions/1489277/...
チロSantilli郝海东冠状病六四事件法轮功

私の問題は次のとおりです。1つのサブディレクトリを除いて、ディレクトリ内のすべてを再帰的に削除したいと思っていました。私はfindwith grepを使用してディレクトリを除外していましたが、親ディレクトリがまだ存在していたため、とにかくすべてが削除されました。
Vincent De Smet 2015

私は直接の解決策をと表示されていない@VincentDeSmet find、あなたは接頭辞をチェックする必要があるだろう:stackoverflow.com/questions/17959317/...しかし、それを扱うことができるループのためのバッシュを:-)
チロSantilli郝海东冠状病六四事件法轮功

\!安全のため、感嘆符()をエスケープしたい場合があります。私のマシンのすべての例でman findはそれが回避されているため、おそらくGood Idea™のようです。編集-だけは言っても、明示的にそれに気づいた:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
エイドリアン・ギュンター

201

再帰の深findさは-maxdepthパラメーターで制御できるだけでなく、対応する-mindepthパラメーターを使用して「上」から深さを制限することもできます。だから実際に必要なのは:

find . -mindepth 1 -type d

5
GNU findで動作しますが、残念ながらPOSIX 7 findの gnu拡張であり、LSBでもPOSIXシェルユーティリティ(GNU拡張ユーティリティではない)を使用しています
Ciro Santilli郝海东冠状病六四事件法轮功

6
これでうまくいきました。すなわち:find . -mindepth 1 -maxdepth 1 -type d ...
racl101

19

find ./* <...>第一レベルのドットファイルを無視してもかまわない場合に使用します(*グロブはデフォルトでbashのこれらと一致しません。shoptビルトインの 'dotglob'オプションを参照してくださいhttps ://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html)。

Eclipse tmp#find。
。
。/画面
./screen/.testfile2
./.X11-unix
./.ICE-unix
./tmux-0
./tmux-0/default
Eclipse tmp#find ./*
。/画面
./screen/.testfile2
./tmux-0
./tmux-0/default

ご参考までに。-execオプションでこのトリックを使用しないでください。たとえば、を試行するとfind dir/* -type d -exec rmdir {} \;、エラーが表示されます。
plhn 2017年

あなたは間違っているか、おそらく誤解されています。そのコマンドは正常に動作します。エラーが発生している場合は、エラーが原因でありrmdir、ディレクトリが空ではないことを示している可能性が高いですfind
ミロスイワノビッチ

2
注:「第1レベルのドットファイルを無視する」とは、すべての隠しファイル/ディレクトリを除外することも意味します。
ジョナサンH

2

まあ、簡単な回避策も(解決策は私のためにwindows git bashで機能していませんでした)

find * -type d

それはあまりパフォーマンスが良くないかもしれませんが、仕事を成し遂げる、そしてそれは時々私たちが必要とするものです。

[編集]:@AlexanderMillsがコメントしたように、ルートの場所に./.hidden隠しディレクトリ(例:)は表示されませんが、隠しサブディレクトリ(例:)は表示され./folder/.hiddenSubます。[Windowsでgit bashを使用してテスト済み]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.