Рекурсивный поиск и удаление файлов, начинающихся с шестнадцатеричного кода 00 00 FF FF в Windows или Linux

Рекурсивный поиск и удаление файлов, начинающихся с шестнадцатеричного кода 00 00 FF FF в Windows или Linux

Цель:

Поиск в папке и всех подпапках файлов (например, *.dat), начинающихся с шестнадцатеричной последовательности 00 00 FF FF в первых 4 байтах, и удаление всех соответствующих файлов без запроса подтверждения на удаление каждого файла.

Например:

В Linux я думал о комбинированном grep + find + hexdump + rm

например:

rm -r рекурсивно удалить соответствующие файлы

hexdump -n4 *.dat для извлечения первых 4 байтов файла

grep '\x00\x00\xFF\xFF' *.dat для поиска файлов, соответствующих возвращенному hexdump 00 00 FF FF

--ВАЖНО-- проверьте, есть ли шестнадцатеричные значения 00 00 FF FF только в первых 4 байтах!

Неважно, есть ли 00 00 FF FF где-либо еще в файле! (нужно проверить только первые 4 байта)

Также помните, что он должен сканировать все файлы *.dat в текущей папке и всех ее подпапках.

И 00 00 FF FF должны быть именно в этой последовательности

Лучшее решение, если бы это было возможно на Windows (даже если бы требовалось использование сторонних утилит). Но был бы рад решению, работающему на Linux

Я попробовал следующую команду, но она ничего не возвращает, и я уверен, что существуют файлы *.dat, которые начинаются с 0000FFFF

rm -r | grep '\x00\x00\xFF\xFF' | hexdump -n4 *.dat

Я не могу понять, как передать все необходимые команды.

Есть идеи, как это сделать?

Заранее спасибо!

решение1

Что-то вроде этого:

find . -type f -exec bash -c 'hexdump -n4 $1 | grep -q "^0000000 0000 ffff"' Anything {} \; -delete;

В замедленной съемке:

  • find . -type fбудет искать все простые файлы в текущем каталоге
  • Для каждого из этих файлов он выполнит однострочную команду bash, hexdump -n4 $1 | grep -q "^0000000 0000 ffff"которая возвращает 0, если файл начинается с00 00 FF FF
  • findпереходит к следующему файлу, если команда, начатая с, -execне возвращает rc=0, в противном случае он продолжает выполнять фильтры или действия над этим файлом, следующим является , который -deleteвыполняется только в том случае, если предыдущий фильтр не дал сбоя.

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

find . -type f -exec bash -c 'hexdump -n4 $1 | grep -q "^0000000 0000 ffff"' Anything {} \; -exec printf "Would delete: %s\n" {} \;

Связанный контент