ls
の出力を解析すると、ファンキーな文字(スペース、\n
、...)、ディレクトリ内のファイル数を知るための最良の方法は何ですか?
私は通常、この解析を回避するためにfind
に依存していますが、同様にfind mydir | wc -l
は同じ理由で壊れます。
私は現在Solarisで作業していますが、さまざまなユニックスやさまざまなシェル間で可能な限り移植性のある答えを探しています。
このトリックはどうですか?
find . -maxdepth 1 -exec echo \; | wc -l
find
およびwc
と同じくらい移植可能です。
Bashを使用し、外部ユーティリティもループもなし:
_shopt -s dotglob
files=(*)
echo ${#files[@]}
_
Kshでは、_shopt -s dotglob
_をFIGNORE=.?(.)
に置き換えます。 zshでは、それを_setopt glob_dots
_に置き換えるか、shopt
呼び出しを削除してfiles=(*(D))
を使用します。 (または、ドットファイルを含めたくない場合は、単に行を削除してください。)可搬性があり、ドットファイルを気にしない場合:
_set -- *
echo $#
_
ドットファイルを含めたい場合:
_set -- *
if [ -e "$1" ]; then c=$#; else c=0; fi
set .[!.]*
if [ -e "$1" ]; then c=$((c+$#)); fi
set ..?*
if [ -e "$1" ]; then c=$((c+$#)); fi
echo $c
_
find . ! -name . -Prune -print | grep -c /
80年代以降のシステムにかなり移植可能であるべきです。
現在のディレクトリの.
と..
を除くすべてのディレクトリエントリがカウントされます。
サブディレクトリ内のファイルもカウントするには:
find .//. ! -name . | grep -c //
(-Prune
が必要ないため、Unix V6(1975)にも移植可能である必要があります)
試してください:
ls -b1A | wc -l
-b
には印刷できない文字が含まれ、-A
は.
と..
を除くすべてのファイルと、1行に1つ(パイプのデフォルトですが、明示するのが適切です) )。
高レベルのスクリプト言語を含める限り、Pythonのワンライナーは次のとおりです。
python -c 'import os; print len(os.listdir(os.sep))'
または完全な「検索」:
python -c 'import os; print len([j for i in os.walk(os.sep) for j in i[1]+i[2]])'
Yocはこのような構造を使用できます。
I=0; for i in * ; do ((I++)); done ; echo $I
しかし、私は恐れています、あなたはArgument list too long.
ディレクトリにファイルが多すぎる場合。しかし、100億ファイルのディレクトリでテストしたところ、問題なく動作しました。
比較的移植性のあるPerlを検討しましたか?
何かのようなもの:
use File::Find;
$counter = 0;
sub wanted {
-f && ++$counter
}
find(\&wanted, @directories_to_search);
print "$counter\n";
Perl
ワンライナー付き(読みやすくするために再フォーマット):
Perl -e 'opendir($dh, ".");
while ( readdir($dh) ) {$count++};
closedir $dh;
print "$count\n";'
または
Perl -e 'opendir($dh, ".");
@files = readdir($dh);
closedir $dh;
print $#files+1,"\n";'
2番目のバージョンでは、Perl
やgrep
などの配列を変更するmap
関数を使用できます。見る perldoc -f readdir
は、grep
を使用した例です。
これを試してください=>使用 ls -i(ノード番号用)および-F(ディレクトリ名に「/」を追加)オプションを使用します。
ls -ilF | egrep -v '/' | wc -l
find
ベースの回答 Stéphaneによって提案 に加えて、以下はls
に基づくPOSIX準拠の回答です。
ls -qf | tail -n +3 | wc -l
私がいつも使用していて問題がなかった最も単純なバージョンは次のとおりです:ls -b1 | wc -l