回答:
「ファイル」の広範な定義を使用する
ls | wc -l
(隠しファイルはカウントせず、ファイル名に改行文字が含まれないと想定していることに注意してください)。
隠しファイルを含める(除くために.
と..
)と改行文字の問題を避けるため、標準的な方法は次のとおりです。
find . ! -name . -prune -print | grep -c /
または再帰的に:
find .//. ! -name . -print | grep -c //
wc
「単語数」プログラムです。-l
スイッチは、行をカウントすることになります。この場合、からの出力の行をカウントしていますls
。これは、常に特定のディレクトリのファイル数を取得するように教えられた方法です。
ls
ませls -1
出力がパイプである場合を。
ls -la
、ディレクトリに3行が表示されます。あなたは欲しいls -lA | wc -l
スキップする.
と..
エントリを。ただし、まだ1つずれています。
ls -q | wc -l
。
ファイルの狭い定義の場合:
find . -maxdepth 1 -type f | wc -l
-maxdepth 1
ファイルを再帰的にカウントするためのを省略できます(または、目的の最大検索深度に合わせて調整します)。
find -maxdepth 1 -type f -printf "\n" | wc -l
ls -1 | wc -l
...
$ ls --help | grep -- ' -1'
-1 list one file per line
...
$ wc --help | grep -- ' -l'
-l, --lines print the newline counts
PS:注ls-<number-one> | wc-<文字-l>
ls
実行し-1
ます。
[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
おそらくls
/ wc
ペアを使用した最も完全な答えは
ls -Aq | wc -l
ドットファイルをカウントする場合、および
ls -q | wc -l
そうでなければ。
-A
ドットファイルをカウントすることですが、とを省略.
し..
ます。-q
ls
非グラフィック文字、具体的には改行文字をで置換し?
、ファイルごとに1行出力しますls
ターミナルから1行の出力を取得するには(つまり、にパイプせずにwc
)、-1
オプションを追加する必要があります。
(ls
coreutils 8.23 でテストされた動作)
-1
必要はありません。「コンソール出力を使用してファイル名の改行を適切に処理する」に関しては、これは「印刷できないファイル名文字と<tab>文字の各インスタンスを強制的に書き込む」-q
スイッチ(-b
ポータブルであるためではなく使用する必要があるため)<question-mark>( '?')文字として。実装は、出力が端末デバイスに対するものである場合、デフォルトでこのオプションを提供する場合があります。たとえばls -Aq | wc -l
、すべてのファイル/ ls -qp | grep -c /
-b
れました-q
。
現在のディレクトリに少なくとも1つの非隠しファイルが含まれていることがわかっている場合:
set -- *; echo "$#"
これは、すべてのグロブに明らかに一般化できます。
スクリプトでは、これには位置パラメータを上書きするという不幸な副作用があります。サブシェルを使用するか、次のような関数(Bourne / POSIXバージョン)を使用することで、この問題を回避できます。
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
代替ソリューションは$(ls -d -- * | wc -l)
です。globがの*
場合、コマンドはに短縮できます$(ls | wc -l)
。の出力を解析するとls
常に不安になりますが、ここでは、ファイル名に改行が含まれていないか、改行が含まれていない限り機能しますls
。また$(ls -d -- * 2>/dev/null | wc -l)
、一致しないグロブのケースを適切に処理するという利点があります(つまり、その場合は0を返しますが、set *
メソッドはグロブが空かどうかを手間をかけずにテストする必要があります)。
ファイル名に改行文字が含まれる可能性がある場合は、代わりにを使用します$(ls -d ./* | grep -c /)
。
一致するファイルが多数ある場合、globの展開を渡すことに依存するこれらのソリューションls
は、引数リストが長すぎるエラーで失敗する可能性があります。
local
か、それを削除する必要があります:eval $1=$#
またはuse echo $#
and do だけですnumber_of_files=$(count_words *)
。
$#
(編集前にそれをしていませんでした)?
$1
。したがって、カウントしたいのは、最初のパラメーターではないパラメーターの数です。(shift
変数名を保持する必要があるため、使用できません。)(今、最初の行について尋ねたら...)
shift
いれば使えます。
-Uを追加する場合、ls / wcペアを使用している間は、はるかに高速になります(ソートしないでください)。
ls -AqU | wc -l
-U
ただし、GNU固有です。
treeコマンドをインストールしたら、次を入力します。
tree
隠しファイルも必要な場合:
tree -a
Debian / Mint / Ubuntu Linuxを使用している場合は、次のコマンドを入力してtreeコマンドをインストールします。
sudo apt-get install tree
オプション-Lは、ディレクトリツリーの最大表示レベルを指定するために使用されます。treeコマンドは、ファイルの数だけでなく、ディレクトリの数もカウントします。ディレクトリツリーの必要なレベルを考慮します。
Gillesが投稿したものに沿った別のテクニックを次に示します。
word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)
これにより、13,923個の要素を持つ配列が作成されます(ファイルがいくつある場合)。
c
配列のポイントは何ですか?word_count() { echo "$#"; }
十分でしょう @Gillesソリューションのポイントは、返された変数にカウントを格納して、コマンド置換(ksh93以外のシェルでのフォークとパイプが必要)を使用する必要がないようにすることです。
以前に与えられたいくつかの答えを改善しますが、今回は明示的に行います。
$ tree -L 1 | tail -n 1 | cut -d " " -f 3
tail
やなどの大好きなコマンドの使用に注目する価値がありcut
ます。また、ツリーはデフォルトでは使用できないことに注意してください。上記のコマンドは、最初にレベル1のディレクトリに関する情報をキャプチャし、次にtail -n 1
目的の最終行を取得し、最終的cut
に3番目の単語を取得します。
たとえば、次の場所にあり/
ます。
/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1
次に、ディレクトリの数を尋ねるのはどうですか?
Linuxでは、コマンドを非常に堅牢にし、名前に改行が含まれる可能性のあるファイルを処理するには、次を使用します。
find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c
これにより、解析出力の試練から解放されls
ます。
関連する:
次のtree
コマンドを使用します。
tree