用于查找文件是否为空的选项或命令

用于查找文件是否为空的选项或命令

是否有一个命令可以查明某个文件是否包含某些内容?

我尝试使用ls“大小选项(ls -lsh)但它没有显示空文件,因为文件/文件夹没有大小。

答案1

您可以使用testwith-f和,如果存在空的常规文件则! -s返回,否则:01

-f FILE
    FILE exists and is a regular file
-s FILE
    FILE exists and has a size greater than zero
test -f file -a ! -s file && printf 'File exists and is empty.\n'

或者使用更常见的语法:

[ -f file -a ! -s file ] && printf 'File exists and is empty.\n'
$ touch empty
$ printf '\n' >non_empty
$ test -f file -a ! -s empty && printf 'File exists and is empty.\n'
File exists and is empty.
$ test -f file -a ! -s non_empty && printf 'File exists and is empty.\n'
$ 

为了方便起见,您可以添加一个函数~/.bashrc

is_empty() { test -f file -a ! -s file && printf 'File exists and is empty.\n'; }

或者使用更常见的语法:

is_empty() { [ -f file -a ! -s file ] && printf 'File exists and is empty.\n'; }
$ touch empty
$ printf '\n' >non_empty
$ is_empty empty 
File exists and is empty.
$ is_empty non_empty 
$ 

答案2

我们可以使用命令根据大小来分析文件du

$> du Desktop/datasheet-3347.pdf                                
3564    Desktop/datasheet-3347.pdf

但是,还有一个小问题。空文件是什么意思?请注意,有些文件包含不可打印的字符。以下是示例:

$> touch myFile.txt                                                            
$> echo '' > myFile.txt
$> du myFile.txt
4   myFile.txt

瞧!我已经将空白区域回显到文件中,但它却报告了一些字节大小?怎么会这样?!好吧,我们仍然在文件中写入了一个换行符。

如图所示这个精彩的答案磁盘上的文件以 4096 字节为单位。当我们向磁盘写入几个字节时,操作系统仍然分配 4096 字节的块。因此从人类可读的角度来看,此处的文件从技术上讲是空的,但它包含字节。

我们可以创建对文件的引用,该文件为 0 字节,但是一旦我们尝试用任何数据填充它,我们就会给它 4096 字节

$> touch myFile2.txt                                                           
$> du myFile2.txt
0   myFile2.txt

但为什么目录是4096字节? 目录是一种列表。一旦您创建了一个目录,即使是空目录,它也会保存信息(对于那些对 C 编程语言感兴趣的人来说,这就是 dirent 结构,它包含 inode 编号、记录长度、类型和名称;查找 dirent.h)。因此,即使目录可能没有文件,它也会包含有关其自身的信息。

答案3

您还可以使用stat

$ touch file
$ stat --format '%F' file
regular empty file
$ echo 'a' > file
$ stat --format '%F' file
regular file

答案4

...或这个:

find /dir/to/file -maxdepth 1 -name file_name -empty

相关内容