Як знайти всі порожні файли та папки в певній папці, включаючи файли, які просто виглядають порожніми, але їх немає?


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 {} \;

(або порожній, АБО файл І греп не виявляє принаймні одного непорожнього символу). Ймовірно, є кращий спосіб.


Вибачте, я щось пропустив, будь ласка, подивіться відредаговану версію мого питання. Додавати це не повинно.

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

Вибачте, я щось пропустив, будь ласка, подивіться відредаговану версію мого питання. Додавати це не повинно.

[ `grep -c [[:alnum:]] "{}"` -eq 0 ]пропустить файли, що містять лише символи, які не є в [A-Za-z0-9]наборі.
кос

@kos - ймовірно, граф замість alnum зробить цю роботу
EdiD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.