Программа which
определяет путь команд оболочки.
Во втором операторе вы установили переменную с именем python
.
Команды оболочки и переменные — совершенно разные вещи.
Возможно, вы хотели бы использовать псевдоним.
alias python="/usr/local/bin/python2.7"
Обратите внимание, что (, за исключением zsh
или tcsh
, или если ваша which
сама является функцией оболочки, которая вызывает GNU which
, как рекомендовано в ее руководстве ), which
будет не показывать псевдоним, в то время как, например type python
будет.
Если вам нужно найти, какие файлы (и )соответствуют какому-либо тексту, используйте:
$ grep -rl 'text to find'./dir
Если вам нужно только первое совпадение каждого файла:
$ for file in./*; do sed -n '/text to match/{p,q}' "$file"; done
который не будет печатать имена совпадающих файлов, но будет быстрым.
Или:
$ find../* -type f -exec sh -c '
a=$(sed -n "/echo/{p;q}" "$1");
[ "$a" ] && printf "%s\n" "$1 : $a"
' findsh {} \;
Если вам нужно также имя файла (, разделенное:
).
Я использую:
grep -h test files* | puniq
puniq
это:perl -ne '$seen{$_}++ or print;'
Он похож на sort -u
, но не сортирует ввод и выдает результат во время работы.
Если вы хотите указать имя файла и избежать дублирования строк в каждом файле:
parallel --tag --lb 'grep string {} | puniq' ::: files*
Если вам нужно имя файла и вы не хотите дублировать строки ни в одном из файлов (Имена файлов не должны содержать TAB (\t)):
parallel --tag --lb grep string {} ::: files* |
perl -ne '/^[^\t]+(.*)/ and $seen{$1}++ or print;'
Возможно, что-то подобное может быть близко к тому, что вы представляете (работает с gnu awk):
cat file1
1
2
3
22
cat file11
1
2
3
8
9
cat file111
1
2
3
5
6
awk '{seen[$0]++;fname[$0]=FILENAME};END{for (k in seen) {if (seen[k]==1) print fname[k],":",k}}' file1*
file111 : 5
file111 : 6
file11 : 8
file11 : 9
file1 : 22