web-dev-qa-db-ja.com

コマンドラインを使用してディレクトリ内のファイル数を取得するにはどうすればよいですか?

多数のファイルを含むディレクトリがあります。カウントを提供するlsスイッチがありません。ファイル数を取得するためのコマンドラインマジックはありますか?

219
Blake

「ファイル」の広い定義を使用する

ls | wc -l

(非表示のファイルはカウントされず、ファイル名に改行文字が含まれていないと想定されていることに注意してください)。

隠しファイル(.および..を除く)を含め、改行文字に関する問題を回避するには、標準的な方法は次のとおりです。

find . ! -name . -Prune -print | grep -c /

または再帰的に:

find .//. ! -name . -print | grep -c //
279
James Roth

ファイルの狭い定義の場合:

 find . -maxdepth 1 -type f | wc -l
35
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-<letter-l>

15
nicomen

du --inodesは便利だと思いましたが、必要なduのバージョンがわかりません。 findwcを使用する代替アプローチよりも大幅に高速になるはずです。

Ubuntu 17.10では、以下が機能します。

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

| sort -nrと組み合わせると、含まれているiノードの数で降順​​でソートされます。

12
krlmlr

おそらくls/wcペアを使用した最も完全な答えは

ls -Aq | wc -l

ドットファイルをカウントする場合

ls -q | wc -l

さもないと。

  • -Aはドットファイルをカウントするためのものですが、.および..は省略します。
  • -q make ls非グラフィック文字、特に改行文字を?に置き換え、ファイルごとに1行出力します

ターミナルのlsから1行の出力を取得するには(つまり、wcにパイプしないで)、-1オプションを追加する必要があります。

(coreutils 8.23でテストされたlsの動作)

12
Frax

現在のディレクトリに隠しファイルが少なくとも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)です。グロブが_*_の場合、コマンドは$(ls | wc -l)に短縮できます。 lsの出力を解析すると常に不安になりますが、ファイル名に改行が含まれていないか、lsで改行されている限り、ここで機能します。そして$(ls -d -- * 2>/dev/null | wc -l)は、一致しないグロブのケースを適切に処理するという利点があります(つまり、その場合は0を返しますが、_set *_メソッドは、グロブが空である可能性がある場合、手間をかけてテストする必要があります)。 。

ファイル名に改行文字が含まれている可能性がある場合は、$(ls -d ./* | grep -c /)を使用することもできます。

グロブの展開をlsに渡すことに依存するこれらのソリューションは、一致するファイルが多数ある場合、(引数リストが長すぎますエラーで失敗する可能性があります。

Ls/wcペアを使用しているときに-Uを追加すると、はるかに速くなります(ソートしないでください)。

ls -AqU | wc -l
5
Jbnair

Treeコマンドをインストールしたら、次のように入力します。

tree

隠しファイルも必要な場合:

tree -a

Debian/Mint/Ubuntu Linuxを使用している場合は、次のコマンドを入力してツリーコマンドをインストールします。

Sudo apt-get install tree

オプション-Lは、ディレクトリツリーの最大表示レベルを指定するために使用されます。 treeコマンドは、ファイルの数だけでなく、ディレクトリの数も数えるので、ディレクトリツリーのレベルをいくつでも考慮できます。

4
lev
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1は非再帰的になり、findはデフォルトで再帰的です
  • -type fはファイルのみを含みます
  • -printf .はかわいいタッチです。ファイル名の代わりにファイルごとにドットを印刷します。これにより、任意のファイル名を処理できるようになり、データも保存されます。ドットを数えるだけです:)
  • | wc -c文字をカウントします
3
aude

パイプなし、文字列コピーなし、フォークなし、単純なbash 1つのライナー

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
1
DaboD

Linuxでは、コマンドを非常に堅牢にして、名前に改行が含まれる可能性のあるファイルを処理するには、次のコマンドを使用します。

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

これにより、ls出力の解析の ordeal から解放されます。


関連:

1
codeforester

1つのGillesが投稿した の別のテクニックを次に示します。

Word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(Word_count *)

これにより、13,923要素の配列が作成されます(ファイルがいくつあるか)。

find . -type f -maxdepth 1 |  wc -l 

現在のディレクトリにあるファイルのみを一覧表示できます。

1
srpatch

以前に与えられたいくつかの答えを改善しますが、今回は明示的に行います。

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

tailcutのようないくつかの愛されているコマンドの使用に注目することは価値があります。また、ツリーはデフォルトでは使用できないことに注意してください。上記のコマンドは、最初にレベル1のディレクトリに関する情報をキャプチャし、次に目的の場所にある最後の行tail -n 1を取得し、最後にcutで3番目のWordを取得します。

たとえば、/に配置します。

/ $ 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

次に、ディレクトリの数を尋ねるのはどうですか?

0
jonaprieto

これを試してみてくださいこの答えがあなたを助けることを願っています

echo $((`ls -l | wc -l` -1 ))
0
Tiger

以下で確認できます:

ls -l | grep -v ^l | wc -l
0
AMIC MING