Опция или команда для нахождения, пуст ли файл

Существует ли команда, которая разрешает посещать открытию, содержит ли файл что-то?

Я попробовал ls'опция размера (ls -lsh) но это не показывает мне пустые файлы, потому что файлы/папки не имеют никакого размера.

4
задан 14 March 2016 в 18:02

4 ответа

Мы могли проанализировать файл использованием размера du команда.

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

Однако существует маленькая выгода. Что мы подразумеваем под пустым файлом? Знайте, что существуют файлы с непечатаемыми символами. Вот пример:

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

Посмотрите! Я повторил вакуум в файл, и все же он сообщает о некотором размере в байтах? как это может быть?! Ну, мы все еще записали единственную новую строку в файл.

Как показано в этом блестящем ответе, файлы на дисках находятся в блоках 4 096 байтов. Когда мы пишем всего несколько байтов в диск, операционная система все еще выделяет блок 4 096 байтов. Таким образом, технически файл здесь пуст с человекочитаемой точки зрения, и все же - это содержит байты.

Мы можем создать ссылку на файл, который составит 0 байтов, но после того как мы пытаемся заполнить ее любыми данными, мы дадим ей 4 096 байтов

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

Но почему каталог составляет 4 096 байтов? каталоги являются видом списков. После того как Вы создаете каталог, даже пустеете один, он содержит информацию (для заинтересованных языком программирования C, это - dirent структура, которая содержит inode число, рекордную длину, введите, и имя; поиск dirent.h). Таким образом даже при том, что каталог не может иметь файлов, он будет содержать информацию о себе.

4
ответ дан 23 November 2019 в 11:39

Можно также использовать stat:

$ touch file
$ stat --format '%F' file
regular empty file
$ echo 'a' > file
$ stat --format '%F' file
regular file
1
ответ дан 23 November 2019 в 11:39

... или это:

find /dir/to/file -maxdepth 1 -name file_name -empty
0
ответ дан 23 November 2019 в 11:39

Можно использовать test с -f и ! -s, который возвратится 0 в случае существующего пустого регулярного файла или 1 иначе:

-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 
$ 
9
ответ дан 23 November 2019 в 11:39

Другие вопросы по тегам:

Похожие вопросы: