Seu script precisará levar mais de dois argumentos.
Antes do shell executar grep
no comando
grep -l "my text" file*.ext
o padrão de globbing de nome de arquivo file*.ext
é expandido para todos os nomes de arquivos correspondentes. A linha de comando que é finalmente executada, portanto, será
grep -l "my text" file1.ext file2.ext file3.ext
(se esses são os arquivos que correspondem ao padrão)
Portanto, seu script pode parecer
#!/bin/sh
pattern=$1
shift
grep -l -e "$pattern" "$@" | xargs ls -lrt
Aqui, o padrão é salvo em uma variável e, em seguida, deslocado da lista de argumentos da linha de comando. Os argumentos restantes são uma lista de nomes de arquivos (se o padrão de globalização do nome de arquivo na linha de comando corresponder) e está disponível em "$@"
.
Certifique-se de que você aspas duplas $@
. Isso fará com que $@
expanda para a lista de argumentos de linha de comando citados individualmente.
Eu removi a opção -a
de ls
, pois não é necessário ao fornecer nomes de arquivos explícitos para a lista. Também estou usando grep
com -e
para especificar o padrão, pois um padrão com um traço inicial ( -
) pode confundir grep
.
Se não fosse pela classificação, eu teria sugerido o seguinte comando find
em vez de seu pipeline (manipula corretamente nomes de arquivos com espaços e novas linhas):
find . -type f -name "$filepattern" -exec grep -q -e "$pattern" {} ';' -ls
Isso procura arquivos com nomes correspondentes ao que está em $filepattern
e com conteúdo correspondente ao que está em $pattern
e, em seguida, produz a saída em ls -l
. A pesquisa é realizada recursivamente no diretório atual.
Como parte de um script:
#!/bin/sh
pattern=$1
filepattern=$2
find . -type f -name "$filepattern" -exec grep -q -e "$pattern" {} ';' -ls
Este script precisaria ser chamado de tal forma que o padrão globbing do nome do arquivo não seja expandido pelo shell ao chamá-lo:
$ ./script.sh 'my text' 'file*.ext'