私| wc -l 'コマンドは現在のディレクトリにあるファイルの数を印刷しますが、これにはすべてのファイルとディレクトリが含まれることを学びました。ディレクトリ以外の通常のファイルだけで同じことができますか?
答え1
目次多くのファイル形式の1つだけです。他のタイプは次のとおりです。シンボリックリンク、先入選出、装備、定期的な、ソケット...
出力では、ls -n
最初の文字は型を表します。d
ディレクトリの-
場合定期的な、l
のためのシンボリックリンク、次のようにすることができます。
LC_ALL=C ls -Aqn | LC_ALL=C grep -c '^-' # regular files only
LC_ALL=C ls -Aqn | LC_ALL=C grep -vc '^d' # anything but directory
(-A
隠しファイルの数を数えたくない場合は、このオプションを削除してください。)
検診もできます。シンボリックリンク解決後、
LC_ALL=C ls -LAqn | LC_ALL=C grep -c '^-' # regular files or symlinks to regulars
LC_ALL=C ls -LAqn | LC_ALL=C grep -vc '^d' # anything but directory and symlinks to dirs.
zsh
シェルの場合は、globbingを使用してこれを行うこともできます。
(){print $#} *(NDoN.) # regular
(){print $#} *(NDoN^/) # non-directories
シンボリックリンクを確認した後(-
glob修飾子を追加):
(){print $#} *(NDoN-.) # regular
(){print $#} *(NDoN-^/) # non-directories
(D
隠しファイルを計算したくない場合は、修飾子を削除してください)。
oN
順序を気にしないので、最適化としてファイルリストのソートを無効にすることです。 GNU実装にはオプションがls
あります-U
。
とにかくls | wc -l
エラーは、ファイル名を区切るために使用された改行の数ls
(ファイルごとに1つ)を数えるだけでなく、ファイル名の改行も計算するために発生します(隠しファイルも無視します)。この-q
オプションを使用すると、ファイル名の改行が?
。
答え2
私は通常次を使用します:
find . -maxdepth 1 -type f | wc -l
注:
- また、次から始まるファイル名も計算します。
.
- 一般ファイルのみを表示(fifo、シンボリックリンクなどは除く)
答え3
まだコメントすることはできませんが、これはbash専用のソリューションです。あまりきれいではありませんが、使用しないと、よりきれいな感じを得ることができますgrep
。
。使用しただけなので、ls
隠しファイルが必要ないとします。
i=0
for f in *
do
[[ -f "$f" ]] && let "i++"
done
echo $i
または1行にまとめるi=0; for f in *; do [[ -f "$f" ]] && let "i++"; done; echo $i