"grep -rn" дает только один из двух ожидаемых результатов

Возможно, чтобы расширить ваши попытки Perl

for f in./*.csv; do 
  perl -i -lpe 'BEGIN{$x = shift @ARGV} s/$/$x/' "$(<"${f%.csv}.txt")" "$f"
done

(в предположении ksh/zsh/bash для оператора $(<file); замените на $(cat<file), если ваша оболочка не поддерживает его ).

давать

$ head./*.csv
==>./1.csv <==
  line 1yyy
  line 2yyy
  line 3yyy

==>./2.csv <==
  line 1zzz
  line 2zzz

Однако на самом деле вам не нужна подстановка регулярных выражений для этого -вы можете рассмотреть возможность замены s/$/$x/простой конкатенацией строк$_.= $x

0
23.09.2021, 16:48
3 ответа

CSPявляется символической ссылкой (см. lвlrwxrwxrwx). По-видимому, ваш grepне следует за символическими ссылками с -r, за исключением символических ссылок, предоставленных в качестве аргументов. Когда вы делаете:

grep -rn "Programmer" *

в родительском каталоге CSP(, то есть в /Institute/IITDhanbad/MTECH/, верно? ), CSPпоявляется как аргумент после расширения оболочки *. Но если вы делаете этот каталог "выше" (в /Institute/IITDhanbad/), то CSPне является аргументом, это символическая ссылка, с которой grepсталкивается во время своего рекурсивного сканирования.

GNU grepработает таким образом. Является ли ваш grepGNU grep? Если это так, см. руководство для -R. -Rпохож на -r, но действительно следует за символическими ссылками.

Обратите внимание, что если вы сделали grep -rn "Programmer".в родительском каталоге CSP, тогда CSPне будет отображаться в качестве аргумента. Использование *имело решающее значение для того, что вы наблюдали.

3
24.09.2021, 03:43

Вы можете упростить свой подход, просто выполнив cmd как:

target_dir="/path/to/directory/of/interest"
[ -d "$target_dir"  ] && grep -rn -e "Programmer" "$target_dir"

или аналогично тому, что вы пробовали, но включая проверку файлового операнда, являющегося каталогом:

target_dir="/path/to/directory/of/interest"
[ -d "$target_dir"  ] && cd "$target_dir" && grep -rn -e "Programmer"

, используя тот факт, что рекурсия(-r)без файлового операнда аналогична рекурсии с $PWDвниз.

Это то, о чем вы просили?

-1
23.09.2021, 19:48

Ответ

В руководстве GNU grep указано, что параметр -rследует только за непосредственными символическими ссылками (, указанными в командной строке ), но не за теми, которые находятся дальше внутри иерархии каталогов:

-r
--recursive
For each directory operand, read and process all files in that directory, recursively. Follow symbolic links on the command line, but skip symlinks that are encountered recursively. Note that if no file operand is given, grep searches the working directory. This is the same as the ‘--directories=recurse’ option

Таким образом, каталог CSP, являющийся символической ссылкой внутри непосредственно заданного каталога MTECH, не проходится при поиске данного текста.

NB :Предыдущий ответ, до уточнения вопроса:

Возможная причина проблемы

В подкаталоге MTECH не может быть установлен бит разрешения на выполнение. Например:

$ mkdir -p one/two
$ cd one
$ cat <<EOT > test.txt
abc def
EOT
$ cp test.txt two
$ grep -rn def *
test.txt:1:abc def
two/test.txt:1:abc def
$ chmod -x two
$ grep -rn def *
test.txt:1:abc def
grep: two/test.txt: Permission denied

По общему признанию, это выдавало бы сообщение об ошибке на stderr. Однако, если grep настроен как псевдоним до/usr/bin/grep -s:

$ alias grep='/usr/bin/grep -s'
$ grep -rn def *
test.txt:1:abc def

Возможно, это последняя часть головоломки.

Решение

Используйте unalias grepперед запуском grep или используйте /usr/bin/grepвместо grep.

1
23.09.2021, 22:13

Теги

Похожие вопросы