Как можно обнаружить все файлы, в которых содержатся нулевые значения?

После сбоя винтов повреждены файлы документов. Восстановление, казалось, прошло успешно, но позже стало известно, что часть файлов восстановлена некорректно. Размер и имя файлов соответствуют норме, но их содержимое повреждено, так как в них только нули (00h), если смотреть через hex-редактор. При выборочной проверке таких файлов не удалось выявить, и теперь в базе находятся поврежденные документы. Я не могу придумать, как найти все эти файлы. Может быть, кто-то может подсказать, какие параметры необходимо использовать в grep, чтобы получить список файлов и папок, в которых они находятся?
  • 18 декабря 2024 г. 23:43
Ответы на вопрос 2
Для поиска файлов, содержащих только нулевые байты, вы можете воспользоваться командой `find` в сочетании с `grep` или использовать утилиты, работающие с бинарными файлами. Вот несколько подходов, которые могут вам помочь.

### Способ 1: Используя `find` и `grep`

1. Откройте терминал.
2. Перейдите в директорию, где хотите выполнить поиск, или укажите путь в команде.
3. Выполните следующую команду:

```bash
find . -type f -exec grep -L . {} + | while read file; do
    if [ $(wc -c < "$file") -eq $(grep -o -E '[^0]' "$file" | wc -l) ]; then
        echo "$file"
    fi
done
```

Эта команда ищет все файлы (`-type f`) и проверяет их на наличие любого не-нуля. В выводе остались только те файлы, которые не содержат символов, отличных от нуля.

### Способ 2: Используя `find` и `od`

Если вы хотите проверить файлы на наличие исключительно нулей, вы можете воспользоваться командой `od`:

```bash
find . -type f -exec od -An -t x1 {} + | grep '^00[ ]*00*$' --color=never | cut -d: -f1 | uniq
```

### Способ 3: Используя `xxd`

Еще один способ — использовать `xxd` для проверки содержимого файлов:

```bash
find . -type f -exec sh -c 'xxd -p "$1" | grep -q -v "^00*$" && echo "$1"' _ {} \; > corrupted_files.txt
```

### Объяснение:

- `find . -type f`: ищет все файлы в указанной директории и поддиректориях.
- `exec`: выполняет команду для каждого найденного файла.
- `grep -L .`: находит файлы, которые не содержат ни одного символа.
- `wc -c < "$file"`: получает размер файла в байтах.
- `grep -o -E '[^0]' "$file"`: находит все символы, отличные от нуля.
- `od -An -t x1`: выводит содержимое файла в шестнадцатеричном формате без адресов.
- `grep '^00[ ]*00*$'`: проверяет, состоит ли файл исключительно из нулевых байтов.

Эти способы помогут вам обнаружить и идентифицировать файлы, которые содержат только нули. Если у вас есть дополнительные требования, пожалуйста, уточните.
grep -irl "что ищем в файле" /где/ищем
Похожие вопросы