Знайти всі нульові байтові файли в каталогах та підкаталогах


82

Як я можу знайти всі нульові байтові файли в каталозі та його підкаталогах?

Я зробив це:

#!/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

Але я отримую результати лише в поточному каталозі, а не в піддиректоріях, і якщо будь-яке ім'я файлу містить пробіл, я отримую лише перше слово, за яким слідує вкладка


1
Можливо, ви хотіли б прочитати man find.
alk

1
Питання також розміщено на unix та linux - будь ласка, не публікуйте одне і те ж питання у кількох місцях.
glenn jackman

наступного разу я не повторюватиму це через проблему в моєму браузері зі stackoverflow, яку я розмістив у суперкористувачі, але тепер проблема виправлена, очистивши історію файлів cookie та улов, тобто я знову запитав тут
Civa

Відповіді:


174

Щоб надрукувати імена всіх файлів розміром 0 $ і менше, розміром 0:

find "$dir" -size 0

Зверніть увагу, що не всі реалізації програми findбудуть видавати вихід за замовчуванням, тому вам може знадобитися зробити:

find "$dir" -size 0 -print

Два коментарі до останнього циклу у питанні:

Замість того, щоб перебирати будь-яке інше слово в рядку та перевіряти, чи альтернативні значення дорівнюють нулю, ви можете частково усунути проблему з пробілами, перебираючи рядки. наприклад:

printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
    test "$size" -eq 0 && echo "$path"; done

Зверніть увагу, що у вашому випадку це не вдасться, якщо будь-який із шляхів, що виводиться ls, містить нові рядки, і це підсилює 2 пункти: не виконуйте синтаксичний аналіз lsта маєте розумну політику імен, яка не допускає пробілів у шляхах.

По-друге, для виведення даних із циклу немає необхідності зберігати вихідні дані у змінних лише до echoнього. Якщо ви просто дозволяєте циклу писати свої результати у stdout, ви виконуєте те саме, але уникаєте його зберігання.


Чи можу я відфільтрувати каталог, відмінний від * .xml
Civa,

2
Також є зручний -emptyваріант.
Wesley Baugh

@WesleyBaugh з опцією -empty ви отримуєте також каталоги з нульовими файлами всередині
Ігор Скабіні

1
@IgorScabini Якщо ви хочете обмежити файли, ви можете це зробити -type f.
Wesley Baugh

Прекрасно! Просто і суто. Чоловіче, я недостатньо використовую цю findкоманду. Я справді мушу подолати свій страх, щоб це зрозуміти. Так корисно.
racl101

32

На додаток до відповідей вище:

Якщо ви хочете видалити ці файли

find $dir -size 0 -type f -delete

1
не потрібно весь час видаляти весь файл розміром 0.
Рагвендра

далі як видалити файл у папці розміром 0
Рагвендра

-exec /bin/rm {} \;або -exec /bin/rm {} +також працюватиме над findреалізаціями, що не стосуються GNU , що не підтримує нестандартне розширення-delete
Герт ван ден Берг,


3

Випробувано Bash 4+ - це правильний спосіб пошуку за розміром 0:

find /path/to/dir -size 0 -type f -name "*.xml"

Шукайте декілька розширень файлів розміром 0:

find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)

Примітка: Якщо ви видалите \ (... \), результатами будуть усі файли, які відповідають цій вимозі, отже, ігноруючи розмір 0.


-inameне є портативним для деяких реалізацій, що не належать до GNU. findПерегляньте тут список стандартних опцій
Герт ван ден Берг,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.