我正在尝试检索与 ip_DBfiles.txt 中列出的日志文件名关联的文件大小以及来自服务器的日志文件名。当匹配文件大小和文件名时,应将其写入第三个文件 op_DBfiles.txt
1.ip_DBfiles.txt
Date Logfilename
01/06/2021 /server/base/a.log
02/06/2021 /server1/base1/b.log
2.cd到/server/lgs
db_listfiles="$(cat ${ip_DBfiles} |awk '{print $3}')"
for i in "${db_listfiles[@]}"
do
find . -type f -print|egrep "(${i})" > /dev/null 2>&1
if [ $? -eq 1 ] ;
then
echo "no action"
else
echo
find . -type f -print|egrep "(${i})" -exec du -ah {} \; > filesize.txt
fi
done
- op_DB文件.txt
Number Date Logfilename size
1 01/06/2021 /server/base/a.log 5
2 02/06/2021 /server1/base1/b.log 6
使用 stat 时,我收到以下错误消息
stat: cannot stat `/server/base/a.log\n/server1/base1/b.log': No such file or directory
尽管该文件存在,但它会使用 find 命令在 filesize.txt 中生成空文件
感谢你的帮助!
答案1
您运行的是 Linux,因此可以使用 GNU 版本stat
(位于 GNU coreutils 包中),它有一个非常有用的--printf
选项用于格式化输出。你for
根本不需要循环。
假设"${db_files[@]}"
数组包含文件名的完整路径(或者至少是相对于当前目录的路径名),您可以运行类似的命令来获取文件大小(以字节为单位)和名称:
stat --printf "%s\t%n\n" "${db_files[@]}"
这将打印文件大小、制表符、文件名,然后打印db_files
.
如果您想要“人类可读”格式的大小,您可以使用numfmt
(也在 GNU coreutils 中)重新格式化它们:
stat --printf "%s\t%n\n" "${db_files[@]}" | numfmt --to=si
例如
$ stat --printf "%s\t%n\n" ./file*.txt
12942 ./file1.txt
71529 ./file2.txt
83135 ./file3.txt
12889 ./file4.txt
$ stat --printf "%s\t%n\n" ./file*.txt | numfmt --to=si
13K ./file1.txt
72K ./file2.txt
84K ./file3.txt
13K ./file4.txt
顺便说一句,如果你想使用循环,你可以这样做:
for f in "${db_files[@]}"; do
if [ -f "$f" ] ; then
stat --printf "%s\t%n\n" "$f" | numfmt --to=si >> "$b_file"
else
echo "$f" >> "$a_file"
fi
done