検索結果から非表示のディレクトリにあるファイルは除外されますが、非表示のファイル(非表示のディレクトリにある)は除外されません。

検索結果から非表示のディレクトリにあるファイルは除外されますが、非表示のファイル(非表示のディレクトリにある)は除外されません。

次のディレクトリ構造を考えると:

$ tree --noreport dir

dir
├── fileA
├── .hiddenfileA
├── .hiddendirA
|   ├── .hiddenfileB
│   ├── fileC
│   └── fileD
└── dirA
    ├── .hiddenfileC
    ├── fileE
    └── fileF

要件は、隠されたディレクトリ内のファイルが結果から除外されますが、隠されたファイル(非表示のディレクトリの下)は含まれないようにfindを呼び出すことです。

予想収益は次のようになります。

./.hiddenfileA
./dirA/.hiddenfileC
./dirA/fileE
./dirA/fileF
./fileA

少し調べて見つけました。こここの情報に基づいて、次の呼び出しを作成しました。find

$ find . -type f -not -path '*/\.*' -print

しかし、このソリューションには欠点があります。隠しディレクトリをスキップします。とファイル

答え1

隠しディレクトリをクリーンアップし、結果をファイルに制限します。

find . -type d -name '.?*' -prune -o -type f -print

提案通りゼチル、ディレクトリをフィルタリングしてファイル、リンクなどを表示することをお勧めします。

find . -type d -name '.?*' -prune -o ! -type d -print

答え2

あなたが持っているコマンドは操作に非常に近いです。使用

find . -type f ! -path '*/.*/*' -print
  • パスパターンは*/.*/*以下を探します/..) すでにフォロー中(最後に)渡すa  / - したがって、セグメント名は次から始まります。. 最後(ファイル名)にはできません。つまり、ディレクトリ名でなければなりません。
  • -pathワイルドカードまたはワイルドカードとも呼ばれるファイル名拡張パターンを使用します。だからあえて\前に貼る必要はない.
  • -notGNU以外のシステムに移植したい場合は使用しないでください。 「いいえ」を意味する使用は  ! POSIXによって指定され、すべてのバージョンfind (BSD、Solarisなど、古代のシステムを含む)で動作します。

関連情報