Я должен удалить рекурсивно все файлы, которые имеют следующее ШЕСТНАДЦАТЕРИЧНОЕ содержание: \xDE\xAD\xBA\xAD
Можно ли предложить терминальную команду, которая сделает это?
Для определения местоположения этих файлов можно использовать эту команду:
LC_ALL=C grep -Fral $'\xDE\xAD\xBA\xAD'
Установка LC_ALL=C
меры по обеспечению безопасности состоят в том, чтобы удостовериться, никакое многобайтовое поведение или любая другая странность не умирают. Это, вероятно, не нужно, хотя мог бы ускорить операцию.
grep
поиски файлов, соответствующих определенному шаблону.
-F
говорит этому, что шаблон является простой строкой, а не регулярным выражением. Это не нужно здесь, хотя был бы необходим, если бы Ваша скороговорка содержала символы, которые имеют особое значение в регулярных выражениях.
-r
говорит grep работать рекурсивно.
-a
говорит этому обрабатывать все файлы (даже, которые это предполагает как двоичный файл).
-l
говорит этому перечислять имена файлов только, не согласующий отрезок (отрезки) длинной линии.
Порядок этих четырех опций не имеет значения.
$'\xDE...'
говорит bash
, Ваш интерпретатор командной строки для размещения тех фактических байтов в командную строку перед запуском grep
. Таким образом, grep
уже видит четыре необработанных байта вместо \xDE...
строка.
Если Вы удовлетворены результатом после того, как пробный прогон (настоятельно рекомендовал), необходимо добавить другого -z
опция к grep
так, чтобы его вывод был разграничен символами NUL, а не новыми строками, и затем передайте вывод по каналу к xargs
:
LC_ALL=C grep ... -z ... | xargs -0 rm -i --
xargs
передачи все значения это видит от его стандартного входа в параметры -i
команда.
xargs
-0
correspond's к grep
-Z
: вход, как ожидают, будет NUL-разделен.
rm
-i
делает rm
интерактивный, удалите это, если Вы абсолютно уверены, что хотите, чтобы все такие файлы были удалены без подтверждения, Вы знаете наверняка, что Вы делаете, у Вас действительно есть резервное копирование, и Вы проверили, что я не сделал значительную ошибку здесь, которая могла привести к неожиданному удалению файлов.:-)
rm
--
удостоверяется rm
не обрабатывает ни одного из его остающихся аргументов как параметры командной строки, на всякий случай grep
первое соответствие было бы началом имени файла -
.
Выполните команду grep сначала для наблюдения файлов интереса:
grep -REl '\\xDE\\xAD\\xBA\\xAD' /path/to/file/location/
Затем использование rm
:
rm -rf $(grep -REl '\\xDE\\xAD\\xBA\\xAD' /path/to/file/location/)
Информация:
-R
: используемый для поиска местоположения с grep
-E
: расширенная regex опция grep
\
: власти regex символ ESC, используемый для проверки \
включен в поиск.
-l
: опция grep перечислить файлы, где упомянутый шаблон были найдены