Цель:
Поиск в папке и всех подпапках файлов (например, *.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" {} \;