Найти все файлы с нулевым байтом в каталоге и подкаталогах

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

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

Civa
источник
1
Вы можете читать man find.
alk
1
Вопрос также размещен в unix и linux - пожалуйста, не размещайте один и тот же вопрос в нескольких местах.
Гленн Джекман
в следующий раз я не буду повторять это из-за проблемы в моем браузере с stackoverflow, которую я написал в суперпользователе, но теперь проблема решена путем очистки файлов cookie истории и улавливания, т.е. я спросил снова здесь
Civa

Ответы:

174

Чтобы напечатать имена всех файлов в $ dir и ниже размера 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вариант.
Уэсли Боуг
@WesleyBaugh с параметром -empty, вы также получаете каталоги с нулевыми файлами внутри
Игорь Скабини
1
@IgorScabini Если вы хотите ограничить файлы, вы можете сделать это -type f.
Уэсли Боуг
Прекрасно! Просто и по делу. Чувак, я недостаточно использую эту findкоманду. Мне действительно нужно преодолеть свой страх понять это. Так полезно.
racl101
32

В дополнение к ответам выше:

Если вы хотите удалить эти файлы

find $dir -size 0 -type f -delete
LinuxLuigi
источник
1
нет необходимости постоянно удалять все файлы размера 0.
Raghvendra
тогда как удалить файл в папке размером 0
Рагвендра
-exec /bin/rm {} \;или -exec /bin/rm {} +будет работать и с реализациями, отличными от GNU find, которые не поддерживают нестандартное расширение-delete
Герт ван ден Берг
8

Нет, вам не нужно беспокоиться о grep.

find $dir -size 0 ! -name "*.xml"
Дозатор
источник
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см. здесь
Герт ван ден Берг,