私の家の最初のレベルには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
-a
ls
ls -q1A . | wc -l
答え3
! -path .
テストを実行するためのパス名は使用したfind
検索パスに相対的であり、そのディレクトリはサンプルコマンドに表示されます.
。別の検索パスを使用している場合は、テストでそのパスを使用してリストされないようにします(例:)。.
find
find "$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 -A
ls -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