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

Вы работаете, исходя из шаткой посылки, заключающейся в том, что badblocks могут решить вашу проблему в первую очередь.

Почему badblocks - ненадежный метод восстановления

Когда вы используете жесткий диск, он постоянно делает все возможное, чтобы скрыть от вас проблемы, заменяя свежие сектора на сомнительные. Жесткий диск поставляется с завода с пулом запасных секторов для этой цели. Пока количество новых сбойных секторов растет медленно, пул запасных секторов сокращается достаточно медленно, чтобы жесткий диск , казалось, работал безупречно.

Единственный способ сбойных блоков может обнаружить сбойный сектор - это когда пул резервных секторов иссяк, что означает, что он деградировал в течение некоторого времени. Другими словами, видимые поврежденные сектора означают, что жесткий диск скрыл так много проблем, что коврик начинает выглядеть бугристым.

Насколько мне известно, жесткие диски исправляли подобные ошибки уже несколько десятилетий, вероятно, с первых дней IDE . В последних системах, которые я использовал, которые с самого начала обнаруживали свой начальный набор сбойных секторов, использовались жесткие диски ESDI и MFM конца 1980-х годов.

Это не означает, что современные жесткие диски больше не поставляются с начальным набором поврежденных секторов. Они делают. Плохие секторы назначаются на заводе, так что тест badblocks на новом жестком диске обнаружит ноль плохих секторов. (Секторы из пула резервных секторов отображаются на место сбойных секторов.)

Если при сканировании badblocks обнаруживаются поврежденные сектора на новом диске или на том, который еще не истек гарантийный срок, это достаточная причина для немедленной его замены.

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

Однако плохие блоки также могут возвращать разные результаты между близко расположенными тестами. (Скажем, два теста выполняются с разницей в день или неделю.) Когда жесткий диск переходит в такое плохое состояние, список сбойных секторов файловой системы становится бессмысленным; жесткий диск умирает. Список сбойных секторов файловой системы дает преимущество только в том случае, если список остается стабильным в течение длительного времени.

Итог: Замените жесткий диск, пока он еще доступен для чтения. Да, я понимаю, что это, вероятно, означает перестройку всего NAS, но это стоимость RAID-0, он же « страшный RAID ».

Лучшее решение: мониторинг

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

Тем не менее, эта команда может сказать вам то, что вам нужно знать:

# smartctl -x /dev/sda | grep Realloc
  5 Reallocated_Sector_Ct   PO--CK   200   200   140    -    0
196 Reallocated_Event_Count -O--CK   200   200   000    -    0

Хотя необработанные и нормализованные значения, которые сообщает smartctl , могут быть неточными, здесь все большее число - особенно большое увеличение за короткий период - всегда плохо.

Обратите внимание, что последний столбец равен нулю на машине, на которой я запускал эту команду. Это то, что я имею в виду, когда говорю, что отчет не заслуживает полного доверия. Это «сырое» значение, а столбцы «200» - это «нормализованное» значение. Этот диск утверждает, что перераспределения никогда не было, что почти наверняка неверно. Что касается «200», это значение, которое производитель жестких дисков придумал самостоятельно, со своим собственным значением. Вы не можете сравнивать его между марками жестких дисков, и, возможно, даже не сможете сравнить его с другими жесткими дисками того же производителя.

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

smartctl сообщает информацию об отдельных жестких дисках, а не об устройствах RAID. Он знает, как взаимодействовать с несколькими типами аппаратных RAID-контроллеров для извлечения информации о каждом диске, но нет необходимости в специальной поддержке программного RAID, поскольку базовые устройства доступны напрямую. Таким образом, вам нужно будет отслеживать как / dev / sda , так и / dev / sdb отдельно в вашем случае, а не / dev / md1 .

smartd - вспомогательный инструмент для smartctl - выполняет такого рода фоновый непрерывный мониторинг.

1
20.01.2019, 00:46
4 ответа

Использование find, обработка каталогов и каталогов, отличных от -, по-разному, получение счетчиков для каталогов и каталогов, отличных от -, отдельно:

find. -name '*exam*' \
    \( \(   -type d -exec echo directory \; \) -o \
    \(    ! -type d -exec grep -q -wF exam {} \; -exec echo file \; \) \) |
sort | uniq -c

Это позволит найти элементы в текущем каталоге или ниже, имена которых содержат строку exam. Если это каталог, то выводится строка directory. В противном случае, если вещь не является каталогом -и если его содержимое содержит слово exam, то выводится строка file. sortи uniq -cв конце будут сортировать и подсчитывать количество найденных файлов и каталогов, соответствующих критериям.

Обратите внимание, что при проверке имен могут совпадать имена, содержащие examв качестве подстроки, как, например, example. grepв файлах использует -w, что повышает вероятность совпадения слова , а не подстроки.

3
27.01.2020, 23:18

Попробуйте это,

Для папок:

 ls -lR * | awk -F '[ /]' ' !/^-/ && !/^d/{if ($NF ~ "exam" ) print $NF}' | wc -l

Для файлов:

 ls -lR * | awk  '/^-/ {if ($NF ~ "exam" ) print $NF}'  | wc -l
0
27.01.2020, 23:18

Следующий сценарий достигает того, что вы хотите:

i=0
for file in *exam*
do
  if [ -d "$file" ] || [ -n "$(sed -n '/exam/{p;q}' -- "$file")" ]
  then
    i=$((i+1))
  fi
done
echo "Number of files: $i"

Он перебирает все файлы, имя которых содержит exam, и для каждого такого файла проверяет, является ли он каталогом или содержит строку exam, и если да, то скрипт увеличивает счетчик на единицу.

Редактировать:Вероятно, я неправильно понял ваш вопрос, и вы хотите считать каталоги и файлы отдельно. В этом случае измените сценарий на

i=0;j=0
for file in *exam*
do
  if [ -d "$file" ]; then
    i=$((i+1))
  elif [ -n "$(sed -n '/exam/{p;q}' -- "$file")" ]; then
    j=$((j+1))
  fi
done
echo "Number of directories: $i"
echo "Number of regular files: $j"
0
27.01.2020, 23:18

Я выполнил две команды ниже

Для подсчета каталогов

find  path -type d -iname "exam[0-9]" | wc -l

Чтобы подсчитать количество файлов с условием, что в файле должно быть исследование содержимого

find  path -type f -iname "exam[0-9]" -exec grep 'exam' {} \;|wc -l
1
27.01.2020, 23:18

Теги

Похожие вопросы