Bash脚本添加目录大小

时间:2018-07-10 14:40:41

标签: bash nested-loops

能帮我解决以下问题

需求:在文本文件上有一个目录位置列表,我可能需要创建一个脚本,该脚本将遍历文本文件并添加磁盘空间。 我有一个部分正常工作的脚本,如下所示,但是该脚本在表达式中给出了一些语法错误

#!/bin/bash 
sum=0  
m=1000 
for j in `cat filelist`  
do 
    if [ -f $j ]; 
    then 
            for i in `cat $j` 
    do  
x=`du -k $i |cut -f1`  
((sum+=$x))  
    done 
size=$(bc <<< "scale=3;$sum/$m")  
echo ${i##*/}, $size >> /tmp/size333.csv  
sum=  
    else  
        continue;    
    fi 
done  

注意:此处的文件列表具有类似

的值
client_846.txt
client_847.txt
client_848.txt
client_849.txt
client_850.txt
client_851.txt
client_854.txt
client_855.txt

在脚本位置的pwd中,我们拥有所有这些文本文件 (client_854.txt,client_855.txt..etc)。

client_854.txt的示例如下:

/home/abc/client_854
/home/bbb/sss/client_854
etc ..

3 个答案:

答案 0 :(得分:0)

一种增加文件大小的方法,该文件的路径写入到名为filelist的文件中列出的文件中:

  

cat文件列表| xargs猫| xargs du -cs

答案 1 :(得分:0)

您在许多方面都在挣扎-主要是因为您打算确定大小并以不正确的方式从pre读取名称。

读取文件的内容时,filelist是读取文件的首选方法。您还添加了对末行末尾的非POSIX行的测试,以确保最后一行得到处理,从而完成完整的循环:

while read -r line; do .... done <file

根据您的情况,您必须(1)从while read -r line || test -n "$line" do ... done < file 中读取文件名(位于$PWD中)。读取的文件名中包含一个绝对路径文件名列表,您必须(2)读取并确定磁盘上每个文件的大小,然后将信息写入包含该文件及其大小的输出文件中。您对filelist的使用尚不清楚,但是如果只是对从bc读取的每个文件名的大小求和,那么简单的整数运算就可以了。 (根据您的解释,我想您需要一个输出文件,其中包括从filelist中的每个名称读取的每个文件的大小。

要确定文件的大小,可以使用filelist返回磁盘上文件的大小(以字节为单位)。这样就无需使用stat -c %s filename(一开始还不清楚)

将这些部分放在一起,您可以编写一个简短的脚本来从cut中的每个文件中读取每个文件名,并将filelist附加到文件名中,并将涉及的所有文件的数据写入新文件{ {1}}。 (如果您正在这样做的话,下面的注释中还包括了如何在", size"中写出每个文件的总数)

filelist_size

注意:我没有要测试的数据文件,因此您可能需要根据情况进行调整或调整)

此外,在输出文件时,请勿从filelist的每个文件中剥离绝对文件名中的路径。唯一有意义的时间是,如果您只想为#!/bin/bash test -z "$1" && { ## validate filelist given as 1st argument printf "error: insufficient input.\nusage: %s <filelist>\n" "${0##*/}" exit 1 } filelist="$1" newfile="${filelist}_size" ## name for file containing files/sizes :> "$newfile" ## truncate newfile while read -r name || test -n "$name" ## read each name in filelist do ## validate name exists in filesystem test -e "$name" || { ## validate file exists printf "error: file does not exist '%s'.\n" "$name" continue } ## sum=0 # reset sum if summing all sizes per-file while read -r filenm || test -n "$filenm" ## read each filenm in name do ## output absolute filenm and size to newfile test -e "$filenm" || { ## validate file exists printf "error: file does not exist '%s'.\n" "$filenm" continue } printf "%s, %d\n" "$filenm" "$(stat -c %s "$filenm")" >> "$newfile" ## sum = $((sum + $(stat -c %s "$filenm"))) # if summing done < "$name" ## printf "%s, %d\n" "$name" "$sum" >> "$newfile" # if summing done < "$filelist" 中的每个文件提供总计(您可以通过将输出删除到filelist并简单地求和,来调整上面的脚本以轻松生成)每个文件的filelist结果)

仔细研究一下方法,如果还有其他问题,请告诉我。

答案 2 :(得分:0)

我已使用以下脚本解决了问题

#!/bin/bash
while read line 
do
 if [ -s "$line" ];
       then
        x=`cat "$line" | xargs du -cs | cut -f 1 |tail -1`
        echo "$line","$x" >> result.csv
       else 
               continue;       
  fi
done < filelist