find命令在linux中生成空文件

find命令在linux中生成空文件

我正在尝试检索与 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
  1. 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

相关内容