非表示のディレクトリとサブディレクトリ(または非表示のディレクトリとサブディレクトリに属する)を除いて、現在のフォルダ内のすべてのディレクトリとサブディレクトリを検索したいと思います。以下は機能しません:
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です。
隠された項目はデフォルトで除外されるので、次のようにします。
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