2017-10-04 18 views
-2

異なるディレクトリにある複数のファイルの合計サイズを計算するにはどうすればよいですか? ファイルの完全なパスと名前を含むテキストファイルがあります。 私は単純なスクリプト使用している間は、ラインを読み、-hは、トリックを行う可能性がありますデュ...Linux - 異なるディレクトリにあるファイルの合計数

Example of text file (new2.txt) containing list of files to sum: 

/mount/st4000/media/A/amediafile.ext 
/mount/st4000/media/B/amediafile.ext 
/mount/st4000/media/C/amediafile.ext 
/mount/st4000/media/D/amediafile.ext 
/mount/st4000/media/E/amediafile.ext 
/mount/st4000/media/F/amediafile.ext 
/mount/st4000/media/G/amediafile.ext 
/mount/st4000/media/H/amediafile.ext 
/mount/st4000/media/I/amediafile.ext 
/mount/st4000/media/J/amediafile.ext 
/mount/st4000/media/K/amediafile.ext 

注図:フォルダ構造は、に基づいて、必ずしもA..K

のように連続していないですAndreaTからの提案は、少しそれを適応させる、私は

while read mediafile;do du -b "$mediafile"|cut -f -1>>subtotals.txt;done<new2.txt 

を試してみましたsubtotals.txtが

733402685 
944869798 
730564608 
213768 
13332480 
366983168 
6122559750 
539944960 
735039488 
1755005744 
733478912 
のように見えます

1つのディレクトリを要約すると、すべての小計

sum=0; while read num; do ((sum += num)); done < subtotals.txt; echo $sum 
+0

投稿ファイルのパス構造と期待される結果 – RomanPerekhrest

答えて

0

この

/home/administrator/filesum/cliprdr.c 
/home/administrator/filesum/cliprdr.h 
/home/administrator/filesum/event.c 
/home/administrator/filesum/event.h 
/home/administrator/filesum/main.c 
/home/administrator/filesum/main.h 
/home/administrator/filesum/utils.c 
/home/administrator/filesum/utils.h 

のようなもので、コマンドls -lの結果は、実行するための最も簡単なコマンドがある

-rw-r--r-- 1 administrator administrator 13452 Oct 4 17:56 cliprdr.c 
-rw-r--r-- 1 administrator administrator 1240 Oct 4 17:56 cliprdr.h 
-rw-r--r-- 1 administrator administrator 8141 Oct 4 17:56 event.c 
-rw-r--r-- 1 administrator administrator 2164 Oct 4 17:56 event.h 
-rw-r--r-- 1 administrator administrator 32403 Oct 4 17:56 main.c 
-rw-r--r-- 1 administrator administrator 1074 Oct 4 17:56 main.h 
-rw-r--r-- 1 administrator administrator 5452 Oct 4 17:56 utils.c 
-rw-r--r-- 1 administrator administrator 1017 Oct 4 17:56 utils.h 

次のとおりです。次の出力を持つ

cat filelist.txt | du -cb | tail -1 | cut -f -1 

(バイト単位)

69370 

duは、実際のディスク使用量を論理ファイルサイズではなく(通常は)4KBの倍数に切り上げて出力することに注意してください。 小さなファイルの場合、この近似は受け入れられない場合があります。

+0

各ファイルのサイズは100であるため、4KBの丸めは問題になりません –

+0

'du -b'は普遍的なオプションではありません。どのようなUNIXシステムでこれを見つけるのですか? – ghoti

+0

@ghoti、私はLinux Mint Cinnamon 18.2を使用しています。 '-b'は' --apparent-size --block-size = 1'と同じようです –

0

を追加するには、しばらくをしなければならない、と親シェルに結果をエクスポートします。 私は、その後のevalのエコーを使用:

eval ' let sum=0$(
     ls -l | tail -n +2 |\ 
     while read perms link user uid size date day hour name ; do 
      echo -n "+$size" ; 
     done 
    )' 

をそれはあなただけの両方のフォルダに二回、このコマンドを再現する必要が

let sum=0+205+1201+1201+1530+128+99 

のように見えた、直接評価ラインを生産しています。そのファイルの入力を想定し

+0

私が行った編集に対してあなたの答えを適応させてください。 –

0

duコマンドには、入手可能なUNIXシステムでは-bオプションがありません。また、ファイルサイズを取得する他の方法もあります。

あなたはbashでwhileループのアイディアのように仮定すると、次のように働くかもしれない:

#!/bin/bash 

case "$(uname -s)" in 
    Linux)  stat_opt=(-c '%s') ;; 
    *BSD|Darwin) stat_opt=(-f '%z') ;; 
    *) printf 'ERROR: I don'\''t know how to run on %s\n' "$(uname -s)" ;; 
esac 

declare -i total=0 
declare -i count=0 
declare filename 

while read filename; do 
    [[ -f "$filename" ]] || continue 
    ((total+=$(stat "${stat_opt[@]}" "$filename"))) 
    ((count++)) 
done 

printf 'Total: %d bytes in %d files.\n' "$total" "$count" 

これはSTDINなどのファイルのリストを取るだろう。 BSD unixまたはLinuxで実行できます。statコマンドのオプション(bashの内部ではありません)は、プラットフォーム固有のビットです。

関連する問題