Возьмем этот образец файла:
$ cat file.txt
=putSomething here;
Теперь, чтобы найти все такие .txt
файлы в текущем каталоге:
$ grep -n '^[[:space:]]*=' *.txt
file.txt:1: =putSomething here;
Если вы хотите найти все такие .txt
файлы в текущем каталоге и во всех его подкаталогах, затем используйте:
$ grep -rn '^[[:space:]]*=' --include '*.txt'
subdir/another.txt:1: =putSomething here;
file.txt:1: =putSomething here;
find
и xargs
здесь не нужны . С опцией -r
grep
выполняет рекурсивный поиск в подкаталогах.
--include '*.txt'
ограничивает grep
файлами, соответствующими glob *.txt
.
^
соответствует началу строки. [[:space:]]*
соответствует нулю или более пробельным символам. =
соответствует знаку равенства. В регулярных выражениях POSIX нет ничего особенного в =
, поэтому его можно рассматривать как любой другой символ.
Завершение регулярного выражения grep с помощью .*$
не меняет совпадающие строки. .*$
совпадает либо с любыми символами, либо без символов. Единственная причина использовать .*$
— изменить то, что grep выделяет как совпадающий текст.
Подстановочный знак не имеет никакого отношения к grep
, все, что видит grep
- это то, что передается ему по трубопроводу. Подстановочный знак расширяется оболочкой, а список файлов, до которых он расширяется, передается в less
. Так что проблема не имеет никакого отношения к grep
.
Тем не менее, если вы ищете неработающие ссылки, вы можете сделать следующее:
for f in /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/*; do
[ -e $(readlink -f "$f") ] || echo "$f";
done
Это позволит перебрать все файлы и каталоги в /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/
, проверить, существует ли их цель (readlink
выведет имя файла, для которого был запущен iot, если этот файл не является ссылкой) и вывести имя, если нет.
Гораздо лучшее решение, о котором я только что узнал:
find /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/ -xtype l
-xtype
будет проверять, является ли цель ссылки, в данном случае, ссылкой, так что это будет верно только для висячих ссылок.
Как @SatoKatsura указал в своем комментарии, (хакерское) использование less
выводится на stderr
, а grep читает из stdout
. Хотя это плохое решение фактической задачи поиска мертвых символических ссылок, оно может работать, перенаправляя stderr
на stdout
:
less ~/.nvm/versions/node/v5.5.0/lib/node_modules/* 2>&1 | grep "Not a file"