現在、ディレクトリ(サブディレクトリを除く)のファイル数を数えるスクリプトを探しています。各ファイルを繰り返し、ディレクトリでない場合は、数を増やす必要があります。出力はファイル数を表す整数でなければなりません。
私はそれを知っています
find . -type f | wc -l
しかし、私はそれが全体の計算タスクを実行するとは思わない。これは課題なので、正しい方向を教えてほしいと思うといいでしょう。
答え1
一般的なファイルだけが必要な場合は、
GNUの使用find
:
find . -maxdepth 1 -type f -printf . | wc -c
その他find
:
find . ! -name . -prune -type f -print | grep -c /
-print | wc -l
(ファイル名に改行文字が含まれていると機能しないため、これは望ましくありません。)
そしてzsh
:
files=(*(ND.)); echo $#files
そしてls
:
ls -Anq | grep -c '^-'
一般ファイルへのシンボリックリンクを含めるには、with GNU、with other、またはwith-type f
に変更するか、オプションをに追加します。しかし、得ることができることに注意してください。-xtype f
find
-exec test -f {} \;
find
.
-.
zsh
-L
ls
偽の否定シンボリックリンクのターゲットタイプを決定できない状況(アクセス権のないディレクトリにあるため)。
通常のファイルだけでなく、あらゆる種類のファイル(シンボルリンク、ディレクトリ、パイプ、デバイス...)が必要な場合:
find . ! -name . -prune -printf . | wc -c
-print | grep -c /
(with non-GNU find
、(ND.)
with (ND)
、zsh
withgrep -c '^-'
に変更されましたwc -l
)ls
。
しかし、に変更しない限り、これは重要ではありません。.
または..
(通常、人々はいつもそこにいるので実際には気にしません)。-A
-a
ls
ディレクトリを除くすべての種類のファイルが必要な場合は、次に置き換える(またはディレクトリへのシンボリックリンクも除く)に置き換え、に置き換え-type f
、に置き換えます。! -type d
! -xtype d
zsh
.
^/
ls
grep -c '^-'
grep -vc '^d'
隠しファイル! -name '.*'
をzsh
除外するには。D
ls
A
答え2
サブディレクトリを除外
find . -maxdepth 1 -type f | wc -l
これは、すべてのファイル名に改行文字が含まれておらず、検索実装がこのオプションをサポートしていると仮定-maxdepth
します。
答え3
到着繰り返し現在のディレクトリ内のすべてのエントリに対して、次を使用します。
for f in ./*; do
その後、使用
[ -f "$f" ]
または
test -f "$f"
取得したものが通常のファイル(またはシンボリックリンク)であるかどうかをテストします。
ソケットファイルやその他の特殊ファイルは除外されます。
到着ディレクトリのみを除く、使用
[ ! -d "$f" ]
代わりに。
変数への参照は重要です。それ以外の場合は、名前付きディレクトリと名前付きファイルがあると誤ってhello world
計算されますhello
。
また、一致する必要があります隠された.
ファイル(前に名前が付いたファイル)の場合は、dotglob
(in)を使用してシェルオプションを設定するか、次を使用できます。shopt -s dotglob
bash
for f in ./* ./.*; do
これらのglobパターンが何も一致しない場合、シェルが何も返さないようにするには、シェルオプション(in)を設定するのがnullglob
賢明かもしれません(そうでなければリテラル文字列および/またはinを取得します)。bash
./*
./.*
f
注:これは課題なので、スクリプト全体を提供するのを避けました。
答え4
改行やその他の印刷できない文字を含むファイルを含むアイテムを処理したい場合は、このソリューションが機能します。しかし、これはあなたの仕事にほぼ確実に重複します。
find . -maxdepth 1 -type f -print0 | tr -dc '\0' | wc -c
これが行うことは、\0
各ファイル名の末尾を除くすべてを削除することです。次に、これらの文字を計算してファイル数を導き出します。