6

Как найти все нулевые байтовые файлы в каталоге и даже в подкаталогах?

Я сделал это:

#!/bin/bash
lns=`vdir -R *.* $dir| awk '{print $8"\t"$5}'`
temp=""
for file in $lns ; do
    if test $file = "0" ;then
        printf $temp"\t"$file"\n"
    fi
    temp=$file
done

... но я получил только файлы в этом каталоге, а не все файлы, и если в имени любого файла был пробел, я получил только первое слово, за которым следовала вкладка.

Может кто-нибудь мне помочь?

3 ответа3

15

find это простой способ сделать это:

find . -size 0

или если вам требуется длинный список, добавьте опцию -ls

find . -size 0 -ls
0

find будет включать все файлы и каталоги под путями, указанными в качестве параметров, и фильтровать их по правилам, заданным в качестве дополнительных параметров. Ты можешь использовать

find "$dir" -type f -name 'glob*' -size 0 -print

Некоторые реализации find что в качестве первого параметра не требуется каталог (некоторые делают, как в Solaris), и по умолчанию используется текущий рабочий каталог (.). В большинстве реализаций параметр -print можно опустить, если он не указан, find значения по умолчанию для печати соответствующих файлов.

  • "$dir" заменяется оболочкой на значение переменной dir (из вопроса)
  • -type f ограничивает его файлами (без каталогов или символических ссылок)
  • -name 'glob*' ограничивает его файлом, имя которого совпадает с glob* (имена файлов начинаются с glob). Чтобы включить все файлы, опустите это
  • -size 0 включает только файлы с размером 0 (одинаковые во всех единицах, для ненулевых значений, c должен быть включен, чтобы проверить размер файла в байтах)
  • -print - это действие, выполняемое с соответствующими файлами. -print напечатает имена файлов. Это может быть опущено в стандартных реализациях find . Если его нет, подразумевается -print .
-3

Вы можете попробовать это:

ls -l | awk -F " " '{if ($5 == 0) print $9}'

Нулевой байт файл рабочего каталога.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .