Возможно, чтобы расширить ваши попытки 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
CSP
является символической ссылкой (см. l
вlrwxrwxrwx
). По-видимому, ваш grep
не следует за символическими ссылками с -r
, за исключением символических ссылок, предоставленных в качестве аргументов. Когда вы делаете:
grep -rn "Programmer" *
в родительском каталоге CSP
(, то есть в /Institute/IITDhanbad/MTECH/
, верно? ), CSP
появляется как аргумент после расширения оболочки *
. Но если вы делаете этот каталог "выше" (в /Institute/IITDhanbad/
), то CSP
не является аргументом, это символическая ссылка, с которой grep
сталкивается во время своего рекурсивного сканирования.
GNU grep
работает таким образом. Является ли ваш grep
GNU grep
? Если это так, см. руководство для -R
. -R
похож на -r
, но действительно следует за символическими ссылками.
Обратите внимание, что если вы сделали grep -rn "Programmer".
в родительском каталоге CSP
, тогда CSP
не будет отображаться в качестве аргумента. Использование *
имело решающее значение для того, что вы наблюдали.
Вы можете упростить свой подход, просто выполнив 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
вниз.
Это то, о чем вы просили?
Ответ
В руководстве 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
.