隠しディレクトリを除くすべてのディレクトリを探す

隠しディレクトリを除くすべてのディレクトリを探す

非表示のディレクトリとサブディレクトリ(または非表示のディレクトリとサブディレクトリに属する​​)を除いて、現在のフォルダ内のすべてのディレクトリとサブディレクトリを検索したいと思います。以下は機能しません:

find . -type d -name "[!.]*"

空の隠しフォルダだけを避けることができると思ったからです。何かこんなに似合う

./.cache/totem

答え1

ドットで始まるディレクトリを「隠し」として分類するとします。そのようなディレクトリを入力したくない場合は、を使用する必要があります-prune

find . -mindepth 1 -type d \( -name '.*' -prune -o -print \)

これは現在のディレクトリで始まります(*ここで指定できますが、ワイルドカードがドットファイル/ディレクトリを含むように設定されていない場合のみ - 例:bash's dotglob)。その後、ディレクトリにのみ一致し、それ.自体には一致しません。括弧内の部分は、find名前が一致すると、.*その項目またはその子項目が考慮されなくなるように切り捨てられ、名前が印刷されることを示します。

(非POSIX)オプションがない場合は、-mindepthこの回避策を使用できます。確かにこれは私が提案した元の解決策よりも優れていますが、答えに両方を残しておきます。

find . -type d \( -name '.?*' -prune -o -print \)

答え2

そしてzsh

print -rC1 -- **/*(N/)

(zsh globsはデフォルトで隠しファイルをスキップします。)

または、次のディレクトリで何でもできます。

for dir (**/*(N/)) anything with $dir

または、anything一度に複数のファイルを取得できる場合は、GNUxargsまたは互換バージョンを使用してください。

xargs -r0a <(print -rNC1 -- **/*(N/)) anything with

POSIX的に:

LC_ALL=C find . -name '.?*' -prune -o -type d -print

LC_ALL=Cそうしないと、名前にユーザーロケールで有効な文字を形成しないバイトシーケンスが含まれている隠しディレクトリをスキップできません。また、述部の順序で終わる-type d名前のペアを防ぐ方法を確認してください。lstat().

このコマンドは.(現在の作業ディレクトリ)も出力します.必要でない場合は、! -name .前に1つを追加するか、次のように変更してください。-type

LC_ALL=C find . ! -name . \( -name '.*' -prune -o -type d -print \)

ファイルに対処し、一度に複数のファイルをインポートするには、またはに-print置き換えます。-exec anything with {} ';'-exec anything with {} +anything

答え3

別のオプションはオープンソースツールFdです。

https://github.com/sharkdp/fd

隠された項目はデフォルトで除外されるので、次のようにします。

fd -t d

アイテムを非表示にするには、次のいずれかまたは両方を使用できます。

-H, --hidden            Search hidden files and directories
-I, --no-ignore         Do not respect .(git|fd)ignore files

答え4

ちょうど使用:

find . ! -path '*/.*' -type d

関連情報