Как найти все файлы с нулевым байтом в каталоге и его подкаталогах?
Я сделал это:
#!/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
Но я получаю результаты только в текущем каталоге, а не в подкаталогах, и если какое-либо имя файла содержит пробел, я получаю только первое слово, за которым следует табуляция
man find
.Ответы:
Чтобы напечатать имена всех файлов в $ 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, вы выполните то же самое, но не сохраните его.источник
-empty
вариант.-type f
.find
команду. Мне действительно нужно преодолеть свой страх понять это. Так полезно.В дополнение к ответам выше:
Если вы хотите удалить эти файлы
find $dir -size 0 -type f -delete
источник
-exec /bin/rm {} \;
или-exec /bin/rm {} +
будет работать и с реализациями, отличными от GNUfind
, которые не поддерживают нестандартное расширение-delete
Нет, вам не нужно беспокоиться о grep.
find $dir -size 0 ! -name "*.xml"
источник
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
см. здесь