通过shell脚本检查大小并删除文件

通过shell脚本检查大小并删除文件

好的,我创建了这样的脚本,它基本上从 MySQL 获取数据并将其存储为 CSV 文件,然后使用 sftp 将所有文件推送到另一台服务器。

所以我想创建一个这样的脚本,它基本上检查文件是否有任何内容。如果文件中没有内容,那么它基本上会在日志中放入“文件中没有内容”并将其删除,并在日志中添加“删除该文件”。

谢谢和问候,萨加尔

答案1

假设您想在当前目录及以下目录中查找空文件,请将它们的路径记录到名为的文本文件中empty.txt,然后删除它们:

find . ! -path ./empty.txt -type f -empty -print -delete >empty.txt

这假设您有一个find理解非标准-empty-delete选项的实现。该命令避免删除empty.txt我们正在登录的文件,否则会查找并删除空的常规文件,同时将其路径名输出到该empty.txt文件。

您可以运行上面的命令而不执行任何操作,-print以查看将删除哪些内容。

对于符合标准的变体:

find . ! -path ./empty.txt -type f -exec sh -c '
    for pathname do
        if [ ! -s "$pathname" ]; then
            printf "%s\n" "$pathname"
            rm -f "$pathname"
        fi
    done' sh {} + >empty.txt

这会为批量找到的文件调用一个简短的内联 shell 脚本。该脚本使用-stest 测试每个路径名,看看它是否为空,如果是(-s测试是真的如果它非空,这就是我们否定测试的原因),则打印出文件的路径名并使用rm -f.

和以前一样,此输出保存到empty.txt.

更短但效率较低的标准版本是

find . ! -path ./empty.txt -type f \
    ! -exec test -s {} \; -print -exec rm -f {} + >empty.txt

这会降低效率,因为它test每个文件执行一次外部命令。

答案2

命令wc -l计算文件行数。这可能是一个构建块:

lineCount=$(<$fileName wc -l)

if [ $lineCount -eq 0 ]; then
  echo "File $fileName has no content"
fi

相关内容