Я написал эту команду в своей оболочке, но она не делает то, что я хотел, и я не могу понять, что я сделал не так. Я хочу получить файлы из текущих каталогов, которые включают их имена в свое содержимое.
find -type f -exec grep -il {} +
Я понимаю, что find -type f
дает мне стандартные файлы из каталога и -exec
выполняет следующую команду grep
с шаблоном, который является именем файла, для данного файла ('+'). Я прав? Потому что похоже я чего-то не понимаю, так как не находит мой специально созданный для этого файл.
Имя файла «plik.txt». и его содержимое включает в себя несколько строк, в том числе строки с надписью «plik.txt» и «./plik.txt».
on given file ('+')
+
выполняет команду над найденными файлами все. {}
заменяется на список файлов в текущем каталоге.
Отладка с помощью -exec echo grep -il {} +
.
Вы хотите:
-exec grep -Fil {} {} ';'
Для поиска имени файла {}
как шаблона в файле с именем {}
. ';'
завершает команду.
Я также добавил -F
, чтобы интерпретировать шаблон буквально.
Вау, спасибо! Это делает свое дело. Можете ли вы также сказать мне, какая разница в одинарных кавычках вокруг точки с запятой? Я предполагаю, что на самом деле это была моя проблема, потому что я пробовал именно эту комбинацию (я имею в виду «{} {}»), но я получал ошибку отсутствия аргумента для «-exec».
what difference make single quotes around the semicolon?
разделены символом ;
или символом новой строки, например echo 123 ; echo 234 ; echo 345
. ;
должен быть передан команде find
буквально, поэтому это строка, содержащая символ ;
, а не специальный разделитель оболочки, поэтому ';'
или \;
или ";"
. т.е. сравните echo 123 ';' echo 234
с echo 123 ; echo 234
.
Значит, это должно быть буквально, чтобы grep
не рассматривал это как аргумент?
grep
разбирает REGEX, если он не буквальный, например .
[
(
*
+
символы имеют особое значение. .
соответствует любому символу, см. man 7 regex
. Например, регулярное выражение ./plik.txt
соответствует a/plikbtxt
.
Файл в текущем каталоге test.txt
Содержимое файла включает «тест»
find . -name 'test.txt' -exec grep -i 'test' {} \;
Am I right?
Действительно, шаблон - это не имя файла, а путь к файлу.my file
каково точное имя файла и содержимое вашего файла?