lsまたはfindを使用して 。と..を除外する方法は?

lsまたはfindを使用して 。と..を除外する方法は?

私の家の最初のレベルには35のファイルとディレクトリがあります(サブディレクトリは入力されません)。しかし、結果は「偽」であり、.特別なディレクトリが含まれているため、36を報告します。 「.」を除外する方法は?

スイッチを試してみましたが、-not -path動作しません。

find . -not -path '*/\.*' -not -path /\. -maxdepth 1|wc -l
36
find $HOME -not -path '*/\.*'  -maxdepth 1|wc -l
36

答え1

使用-mindepth:

find . -mindepth 1 -maxdepth 1    |wc -l

答え2

find開始されたディレクトリが含まれており、必要な結果を得るには、変更せずに出力から除外してください。

find . -maxdepth 1 ! -path . | wc -l
find "$HOME" -maxdepth 1 ! -path "$HOME" | wc -l

$HOME(パターン文字として解釈できる文字が含まれていない限り、つまり *?[])。名前だけを一致させ、.必要に応じて興味のあるパスに追加することもできます。

find . -maxdepth 1 ! -name . | wc -l
find "$HOME"/. -maxdepth 1 ! -name . | wc -l

見つかったファイルの数を正確に数えるには、findファイル名(改行を含めることができます)以外の他の項目も計算する必要があります。例えばfindあなたがサポートしている場合-printf

find . -maxdepth 1 ! -name . -printf 1 | wc -c

または POSIX の場合は、find次の//トリックを使用します。

find .//. -maxdepth 1 ! -name . | grep -c //

..問題ではありません。明示的に追加しない限り(...)find含まれません。find ..

lsこれはデフォルトでは.表示されません。隠しファイルを表示したいと..表示するには、代わりにこのオプションを使用します。 GNUを使用すると、特殊文字を引用するように要求することができ、ファイルの数を正確に数えることができます。...-A-als

ls -q1A . | wc -l

答え3

! -path .テストを実行するためのパス名は使用したfind検索パスに相対的であり、そのディレクトリはサンプルコマンドに表示されます.。別の検索パスを使用している場合は、テストでそのパスを使用してリストされないようにします(例:)。.findfind "$HOME" ! -path "$HOME"

また、を使用すると、wc -l実際にはファイル数を数えるのではなく、生成された行数を数えます。findこれは、名前に改行文字が含まれている場合はファイル数より多い可能性があります。

POSIXでは、find次のことができます。

find . ! -path . -prune -exec echo x \; | wc -l 

現在ディレクトリにある名前の数を数えます。ここでは、すべてのサブディレクトリ入力が-prune停止しfind、見つかった各名前に対して1行に1文字が出力されます-exec echo x \;xその後、行が計算されますwc -l

.表示されない、..またはがある場合は代わりにls使用してください。ls -Als -a


単一のディレクトリで名前を計算する別の方法(可能なすべてのファイル名を許可)は次のとおりです。

shopt -s dotglob nullglob
set -- *
echo "$#"

...からbash、または

set -- *(DN)
echo $#

... zsh(隠された名前と一致するように(DN)動作を変更し*、一致するものがない場合は、アクティブ化とdotglobシェルnullglobオプションの効果と同様にパターンを完全に削除しますbash)。

両方のコードスニペットは、場所パラメータを非表示の名前を含む現在のディレクトリの名前のリストに設定します。これが完了したら、特殊変数で設定された位置パラメータの数を見つけることができます$#

ワイルドカードパターンは*match.でもmatchでもありません..。隠された名前を一致させるように求められた場合も同様です。

yashシェルで隠された名前と一致するようにdot-globシェルオプションを設定し、set -o dot-glob*含むしたがって、.このシェルを使用する場合は、..の値から2を引く必要があります。$#

答え4

最も簡単。働くファイル名に改行を含める代わりに、おそらくそれは恐ろしい標準なので、ファイル名を変更するように言いたいと思います。

ls -d * | wc -l

関連情報