多数のファイルを含むディレクトリがあります。カウントを提供するls
スイッチがありません。ファイル数を取得するためのコマンドラインマジックはありますか?
「ファイル」の広い定義を使用する
ls | wc -l
(非表示のファイルはカウントされず、ファイル名に改行文字が含まれていないと想定されていることに注意してください)。
隠しファイル(.
および..
を除く)を含め、改行文字に関する問題を回避するには、標準的な方法は次のとおりです。
find . ! -name . -Prune -print | grep -c /
または再帰的に:
find .//. ! -name . -print | grep -c //
ファイルの狭い定義の場合:
find . -maxdepth 1 -type f | 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-<letter-l>
du --inodes
は便利だと思いましたが、必要なdu
のバージョンがわかりません。 find
とwc
を使用する代替アプローチよりも大幅に高速になるはずです。
Ubuntu 17.10では、以下が機能します。
du --inodes # all files and subdirectories
du --inodes -s # summary
du --inodes -d 2 # depth 2 at most
| sort -nr
と組み合わせると、含まれているiノードの数で降順でソートされます。
おそらくls
/wc
ペアを使用した最も完全な答えは
ls -Aq | wc -l
ドットファイルをカウントする場合
ls -q | wc -l
さもないと。
-A
はドットファイルをカウントするためのものですが、.
および..
は省略します。-q
make ls
非グラフィック文字、特に改行文字を?
に置き換え、ファイルごとに1行出力しますターミナルのls
から1行の出力を取得するには(つまり、wc
にパイプしないで)、-1
オプションを追加する必要があります。
(coreutils 8.23でテストされたls
の動作)
現在のディレクトリに隠しファイルが少なくとも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
Treeコマンドをインストールしたら、次のように入力します。
tree
隠しファイルも必要な場合:
tree -a
Debian/Mint/Ubuntu Linuxを使用している場合は、次のコマンドを入力してツリーコマンドをインストールします。
Sudo apt-get install tree
オプション-Lは、ディレクトリツリーの最大表示レベルを指定するために使用されます。 treeコマンドは、ファイルの数だけでなく、ディレクトリの数も数えるので、ディレクトリツリーのレベルをいくつでも考慮できます。
find -maxdepth 1 -type f -printf . | wc -c
-maxdepth 1
は非再帰的になり、find
はデフォルトで再帰的です-type f
はファイルのみを含みます-printf .
はかわいいタッチです。ファイル名の代わりにファイルごとにドットを印刷します。これにより、任意のファイル名を処理できるようになり、データも保存されます。ドットを数えるだけです:)| wc -c
文字をカウントしますパイプなし、文字列コピーなし、フォークなし、単純なbash 1つのライナー
$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
Linuxでは、コマンドを非常に堅牢にして、名前に改行が含まれる可能性のあるファイルを処理するには、次のコマンドを使用します。
find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c
これにより、ls
出力の解析の ordeal から解放されます。
関連:
1つのGillesが投稿した の別のテクニックを次に示します。
Word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(Word_count *)
これにより、13,923要素の配列が作成されます(ファイルがいくつあるか)。
find . -type f -maxdepth 1 | wc -l
現在のディレクトリにあるファイルのみを一覧表示できます。
以前に与えられたいくつかの答えを改善しますが、今回は明示的に行います。
$ tree -L 1 | tail -n 1 | cut -d " " -f 3
tail
やcut
のようないくつかの愛されているコマンドの使用に注目することは価値があります。また、ツリーはデフォルトでは使用できないことに注意してください。上記のコマンドは、最初にレベル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
次に、ディレクトリの数を尋ねるのはどうですか?
これを試してみてくださいこの答えがあなたを助けることを願っています
echo $((`ls -l | wc -l` -1 ))
以下で確認できます:
ls -l | grep -v ^l | wc -l