検索結果から隠しディレクトリのファイルを除外しますが、隠しファイル(隠しディレクトリではないディレクトリの下)は除外しません。

検索結果から隠しディレクトリのファイルを除外しますが、隠しファイル(隠しディレクトリではないディレクトリの下)は除外しません。

次のディレクトリ構造があるとします。

$ 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 以外のシステムへの移植性が必要な場合は、 を使用しないでください。 を使用して「not」を表すことは POSIX で規定されており、 のすべてのバージョン (BSD、Solaris など、および古いシステムでも)! で動作します。find

関連情報