如何验证文件绝对没有内容。[ -s $file ] 给出文件是否为零字节,但如何知道文件是否绝对为空且没有包含空行的数据?
$cat sample.text
$ ls -lrt sample.text
-rw-r--r-- 1 testuser userstest 1 Jul 31 16:38 sample.text
When i "vi" the file the bottom has this - "sample.text" 1L, 1C
您的文件可能只有换行符。
试试这个检查:
[[ $(tr -d "\r\n" < file|wc -c) -eq 0 ]] && echo "File has no content"
根据定义,大小为 0 的文件中没有任何内容,所以你很高兴。但是,您可能想要使用:
if [ \! -s f ]; then echo "0 Sized and completely empty"; fi
玩得开心!
空行将数据添加到文件中,因此会增加文件大小,这意味着仅检查文件是否为 0 字节就足够了。
对于单个文件,使用 bash 内置的方法(-s
fortest
或)。(使处理不那么可怕,但特定于 bash)[
[[
[[
!
fn="file"
if [[ -f "$fn" && ! -s "$fn" ]]; then # -f is needed since -s will return false on missing files as well
echo "File '$fn' is empty"
fi
一种(更多)POSIX shell 兼容方式:(感叹号的转义可以依赖于 shell)
fn="file"
if test -f "$fn" && test \! -s "$fn"; then
echo "File '$fn' is empty"
fi
对于多个文件,find 是一种更好的方法。
对于单个文件,您可以执行以下操作:(如果为空,它将打印文件名)
find "$PWD" -maxdepth 1 -type f -name 'file' -size 0 -print
对于多个文件,匹配 glob glob*
:(如果为空,它将打印文件名)
find "$PWD" -maxdepth 1 -type f -name 'glob*' -size 0 -print
允许子目录:
find "$PWD" -type f -name 'glob*' -size 0 -print
有些find
实现不需要将目录作为第一个参数(有些实现,比如 Solaris)。在大多数实现中,该-print
参数可以省略,如果未指定,则find
默认打印匹配文件。