次のディレクトリ構造を考えると:
$ 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
ワイルドカードまたはワイルドカードとも呼ばれるファイル名拡張パターンを使用します。だからあえて\
前に貼る必要はない.
。-not
GNU以外のシステムに移植したい場合は使用しないでください。 「いいえ」を意味する使用は!
POSIXによって指定され、すべてのバージョンfind
(BSD、Solarisなど、古代のシステムを含む)で動作します。