能帮我解决以下问题
需求:在文本文件上有一个目录位置列表,我可能需要创建一个脚本,该脚本将遍历文本文件并添加磁盘空间。 我有一个部分正常工作的脚本,如下所示,但是该脚本在表达式中给出了一些语法错误
#!/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 ..
答案 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