Как найти все пустые файлы и папки в определенном каталоге, включая файлы, которые выглядят пустыми, но не являются?

18

Допустим, в моей папке ~/listесть большое количество папок, каждая из которых имеет свои собственные подпапки, подпапки и т. Д., И на каждом уровне есть много файлов. Однако некоторые из этих файлов и папок пусты, так как я могу рекурсивно искать их все, чтобы найти пустые файлы и папки? И затем отобразить их в списке местоположений файлов, чтобы я знал, где находится каждый из них (также должно быть ясно, какой файл является папкой, а какой - папкой, поскольку не все файлы имеют расширения файлов). Я использую Ubuntu GNOME 15.10 с GNOME 3.18.

Обратите внимание, что было бы также очень полезно, если бы мне также сообщалось, если файл выглядит пустым, но его нет (например, если в нем есть пробелы или переносы строк или что-то в этом роде). И будет делать различие между реальным пустым файлом и файлом, который выглядит пустым в выводе.


источник
1
Пустой файл, это файл без символов? (могут быть пробелы, переносы строк и табуляции)?
Джейкоб Влейм
@JacobVlijm: Раньше я думал только о файлах размером 0 байт, но теперь, когда вы упомянули об этом, кто-то, возможно, был достаточно сумасшедшим, чтобы дать мне файл с пробелами или переносами строк или чем-то еще, поэтому я бы тоже хотел их обнаружить, но я бы хотел, чтобы выходные данные различали фактический пустой файл и тот, который выглядит пустым.

Ответы:

25

Из man find

    -empty File is empty and is either a regular file or a directory.

Поэтому для поиска как пустых файлов, так и каталогов достаточно сделать

find ~/lists -empty

Чтобы указать тип, вы можете использовать %yспецификатор выходного формата

          %y     File's type (like in ls -l), U=unknown type (shouldn't happen)

например

find ~/lists -empty -printf '%y %p\n'

или использовать внешнюю программу, например ls, которая включает в себя --classifyопцию

    -F, --classify
          append indicator (one of */=>@|) to entries

т.е.

find ~/lists -empty -exec ls -Fd {} \;

Если ваше определение «пустого» расширено, чтобы включить в него файлы, содержащие только пробельные символы, то оно становится более сложным - и более сложным в вычислительном отношении, поскольку теперь вам нужно фактически открыть по крайней мере любые непустые файлы и проверить их содержимое. Самый эффективный способ, который я могу придумать, - это что-то вроде

find ~/list \( -empty -o \( -type f -a ! -exec grep -qm1 '[^[:blank:]]' {} \; \) \) -exec ls -Fd {} \;

(либо пустой, либо файл И grep не обнаруживает хотя бы один непустой символ). Вероятно, есть лучший способ, хотя.

steeldriver
источник
Извините, я что-то пропустил, пожалуйста, посмотрите отредактированную версию моего вопроса. Это не должно быть слишком много, чтобы добавить.
11

Из ~/listпапки:

find . -empty -type d

для перечисления пустых каталогов и

find . -empty -type f

для распечатки пустых файлов.

find . -type f -exec bash -c 'if [ `cat "{}" |wc -w` -eq 0 ]; then echo "file - {}";fi' \; -or -empty -exec bash -c "echo dir - {}" \; 

для отображения пустых папок и файлов, включая пробелы и пустые строки

EDID
источник
И будет ли это рекурсивно перечислять подпапки и их содержимое?
это будет рекурсивно показывать пустые файлы и папки
EdiD
Извините, я что-то пропустил, пожалуйста, посмотрите отредактированную версию моего вопроса. Это не должно быть слишком много, чтобы добавить.
[ `grep -c [[:alnum:]] "{}"` -eq 0 ]пропустит файлы, содержащие только символы, не входящие в [A-Za-z0-9]набор.
Кос
@kos - возможно, вместо графика будет работать alnum
EdiD