strace
показывает мне, что ls -i
вызывает lstat()
для каждого имени файла
Это объясняет дополнительную работу.
Учитывая, что readdir ()уже вернул номер инода, это кажется менее -оптимальным
Хотя это похоже на ошибку, такое поведение связано с согласованностью точек монтирования. (см. комментарий Томаса)
В оболочке можно использовать следующую команду. Это должно сработать, если искомый шаблонKey = 0
grep -lrIZ "Key = 0". | xargs -0 rm -f --
Общая команда:
grep -lrIZ "<Pattern to be searched in the file>". | xargs -0 rm -f --
Основная проблема с предложенной вами командой,
grep -i "Key = 0" * | rm *
заключается в том, что rm
не читает из своего стандартного входного потока, что означает, что он ничего не читает из команды grep
в левой части конвейера.
Вместо этого rm *
в правой части канала будет игнорировать все входные данные и просто выполнять rm
для каждого видимого имени файла в текущем каталоге.
Игнорируя проблему с тем, что rm
не читает стандартный ввод, ваша команда grep
имеет две основные проблемы:
rm
, так как нам нужно знать только имена файлов, которые мы хотим удалить. Key = 0
как подстрока , что означает, что он также соответствует таким строкам, как Crypto Key = 0x01
и т. д. find. -type f -exec grep -q -F -x 'Key = 0' {} \; -exec rm -f {} +
или, с GNUfind
(и некоторыми другими ),
find. -type f -exec grep -q -F -x 'Key = 0' {} \; -delete
Оба они будут искать обычные файлы в текущем каталоге или ниже, и для каждого найденного файла будет выполняться grep -q -F -x 'Key = 0'
. Эта команда grep
вернет статус выхода, сигнализирующий, есть ли в файле строка, которая соответствует именноKey = 0
(и ничему другому ).
Если такая строка будет найдена, вторая команда find
удалит файл с помощью предиката -delete
. Первая команда find
собирала пути к файлам, содержащим эту строку, а затем запускала rm -f
для их пакетов.
Флаги, используемые с grep
, следующие:
-q
, для бесшумной работы. Утилита не выводит совпадающие строки, но успешно завершает работу после первого совпадения или с нулевым статусом выхода, отличным от -, если файл не содержит совпадений. -F
, для фиксированного сопоставления строк. Мы сопоставляем строку,не регулярное выражение. -x
, чтобы найти только полные совпадения строк. Это имеет тот же эффект, что и при использовании регулярного выражения, привязанного как к началу, так и к концу строки. Я не использую здесь -i
с grep
, так как это также удалит файлы, содержащие такие строки, как KEY = 0
и kEY = 0
и т. д., и вы ничего не сказали об этих вариантах регистра.
Если вы хотите, чтобы команда find
была ограничена определенным суффиксом имени файла, например .ext
, используйте -name '*.ext'
в команде find
перед выполнением grep
. Например:
find. -name '*.ext' -type f -exec grep -q -F -x 'Key = 0' {} \; -exec rm -f {} +