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