28

私はいくつかのフォルダにいくつかのファイルを持っています:

/home/d/folder1/a.txt
/home/d/folder1/b.txt
/home/d/folder1/c.mov
/home/d/folder2/a.txt
/home/d/folder2/d.mov
/home/d/folder2/folder3/f.txt

/ home / d /内のすべての.txtファイルが占めるディスク容量の総量を測定するにはどうすればよいですか?

duは特定のフォルダーの合計スペースを示しls -lは個々のファイルの合計スペースを示しますが、すべてのtxtファイルを合計して、すべてが占めるスペースを確認したい場合はどうでしょうか / home / d /内のすべての.txt(folder1とfolder2の両方、およびfolder3などのサブフォルダーを含む)の合計1つの巨大なtxtファイル?

4

13 に答える 13

44

find folder1 folder2 -iname '*.txt' -print0 | du --files0-from - -c -s | tail -1

于 2009-08-31T19:10:56.690 に答える
25

これにより、ディスク容量の使用量が拡張子別にバイト単位で報告されます。

find . -type f -printf "%f %s\n" |
  awk '{
      PARTSCOUNT=split( $1, FILEPARTS, "." );
      EXTENSION=PARTSCOUNT == 1 ? "NULL" : FILEPARTS[PARTSCOUNT];
      FILETYPE_MAP[EXTENSION]+=$2
    }
   END {
     for( FILETYPE in FILETYPE_MAP ) {
       print FILETYPE_MAP[FILETYPE], FILETYPE;
      }
   }' | sort -n

出力:

3250 png
30334451 mov
57725092729 m4a
69460813270 3gp
79456825676 mp3
131208301755 mp4
于 2013-02-08T11:04:24.817 に答える
16

単純:

du -ch *.txt

必要な合計スペースを表示したいだけの場合は、次のようにします。

du -ch *.txt | tail -1
于 2013-10-04T17:39:23.673 に答える
6

これを行う方法は次のとおりです(LinuxではGNU coreutilsとBash構文を使用)。悪い習慣duを避けます。

total=0
while read -r line
do
    size=($line)
    (( total+=size ))
done < <( find . -iname "*.txt" -exec du -b {} + )
echo "$total"

現在のディレクトリを除外する場合は、を使用-mindepth 2findます。

Bash構文を必要としない別のバージョン:

find . -iname "*.txt" -exec du -b {} + | awk '{total += $1} END {print total}'

これらは改行を含むファイル名では正しく機能しないことに注意してください(ただし、スペースを含むファイル名は機能します)。

于 2009-08-31T21:13:43.790 に答える
5

マックOS

  • ツールduとパラメータ-Iを使用して、他のすべてのファイルを除外します

Linux

-X, --exclude-from=FILE
              exclude files that match any pattern in FILE

--exclude=PATTERN
              exclude files that match PATTERN
于 2009-09-01T09:15:51.747 に答える
4

これはそれを行います:

total=0
for file in *.txt
do
    space=$(ls -l "$file" | awk '{print $5}')
    let total+=space
done
echo $total
于 2009-08-31T19:10:56.893 に答える
3

GNUは、

find /home/d -type f -name "*.txt" -printf "%s\n" | awk '{s+=$0}END{print "total: "s" bytes"}'
于 2009-09-01T11:04:36.567 に答える
2

ennuikillerに基づいて、これは名前のスペースを処理します。私はこれを行い、小さなレポートを取得する必要がありました:

find -type f -name "* .wav" | grepエクスポート| ./calc_space

#!/bin/bash
# calc_space
echo SPACE USED IN MEGABYTES
echo
total=0
while read FILE
do
    du -m "$FILE"
    space=$(du -m "$FILE"| awk '{print $1}')
    let total+=space
done
echo $total
于 2010-08-22T16:50:49.107 に答える
2

bashでGNUツールを使用している人のためのワンライナー:

for i in $(find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u); do echo "$i"": ""$(du -hac **/*."$i" | tail -n1 | awk '{print $1;}')"; done | sort -h -k 2 -r

extglobを有効にする必要があります。

shopt -s extglob

ドットファイルを機能させるには、実行する必要があります

shopt -s dotglob

サンプル出力:

d: 3.0G
swp: 1.3G
mp4: 626M
txt: 263M
pdf: 238M
ogv: 115M
i: 76M
pkl: 65M
pptx: 56M
mat: 50M
png: 29M
eps: 25M

于 2015-08-28T12:20:22.310 に答える
1

特定のパスとサブディレクトリ内のすべてのテキストファイルの合計サイズを取得するための私のソリューション(perl onelinerを使用)

find /path -iname '*.txt' | perl -lane '$sum += -s $_; END {print $sum}'
于 2016-07-27T22:52:08.977 に答える
0

私はfindをxargsと組み合わせて使用​​するのが好きです:

find . -name "*.txt" -print0 |xargs -0 du -ch

総計のみを表示したい場合は、テールを追加します

find . -name "*.txt" -print0 |xargs -0 du -ch | tail -n1
于 2016-07-22T09:42:05.963 に答える
0

コマンドラインでmacOSを使用してこれを実行したい場合は、printfではなく-print0引数に基づくバリエーションが必要です。上記の回答のいくつかはそれに対処しますが、これは拡張によって包括的にそれを行います:

    find . -type f -print0 | xargs -0 stat -f "%N %i" |
  awk '{
      PARTSCOUNT=split( $1, FILEPARTS, "." );
      EXTENSION=PARTSCOUNT == 1 ? "NULL" : FILEPARTS[PARTSCOUNT];
      FILETYPE_MAP[EXTENSION]+=$2
    }
   END {
     for( FILETYPE in FILETYPE_MAP ) {
       print FILETYPE_MAP[FILETYPE], FILETYPE;
      }
   }' | sort -n
于 2018-12-27T20:05:09.007 に答える
0

受け入れられた回答にはいくつかの潜在的な問題があります。

  1. サブディレクトリに分類されません(のような非標準のシェル機能に依存することなくglobstar
  2. 一般に、以下のDennis Williamsonが指摘しているように、次の出力の解析は避ける必要があります。ls
    • つまり、ユーザーまたはグループ(列3および4)にスペースが含まれている場合、列5はファイルサイズになりません。
  3. そのようなファイルが100万個ある場合、これにより200万個のサブシェルが生成さ、遅くなります。

ghostdog74によって提案されているように、GNU固有の-printfオプションを使用しfindて、より堅牢なソリューションを実現し、過剰なパイプ、サブシェル、Perl、および奇妙なduオプションをすべて回避できます。

# the '%s' format string means "the file's size"
find . -name "*.txt" -printf "%s\n" \
  | awk '{sum += $1} END{print sum " bytes"}'

はい、はい、pasteまたはを使用したソリューションbcも可能ですが、これ以上簡単ではありません。

macOSでは、HomebrewまたはMacPortsを使用してインストールし、代わりにfindutils呼び出す必要があります。gfind(この質問には「linux」タグがありますが、「unix」というタグも付いています。

GNUがなくfindても、次の使用にフォールバックできますdu

find . -name "*.txt" -exec du -k {} + \
  | awk '{kbytes+=$1} END{print kbytes " Kbytes"}'

…しかし、歴史的な理由からdu、デフォルトの出力は512バイトブロックであるという事実に注意する必要があり(マニュアルページの「根拠」セクションを参照)、一部のバージョンdu(特にmacOS)にサイズをバイト単位で出力するオプション。

ここにある他の多くの優れたソリューション(特にBarnの回答を参照)ですが、ほとんどの場合、不必要に複雑であるか、GNUのみの機能に過度に依存しているという欠点があります。おそらく、ご使用の環境では問題ありません。

于 2019-09-12T19:05:44.830 に答える