Existem alguns problemas no seu código:
-
O padrão
*.tex
será expandido ao chamar a funçãoDO
, se corresponder a qualquer nome de arquivo no diretório atual. Você terá que citar o padrão como'*.tex'
,"*.tex"
ou\*.tex
ao chamar a função. -
O
ls
não é necessário. Você já tem os doisfind
egrep
que podem relatar os nomes de caminho dos arquivos encontrados. -
-name "$@"
só funciona corretamente se"$@"
contiver um único item. Seria melhor usar-name "$1"
. Para uma solução que permite vários padrões, veja abaixo.
A função pode ser escrita
DO () {
# Allow for multiple patterns to be passed,
# construct the appropriate find expression from all passed patterns
for pattern do
set -- "$@" '-o' '-name' "$pattern"
shift
done
# There's now a -o too many at the start of "$@", remove it
shift
find . -type f '(' "$@" ')' -exec grep -qF 'TODO' {} ';' -print
}
Chamando essa função como
DO '*.tex' '*.txt' '*.c'
fará com que seja executado
find . -type f '(' -name '*.tex' -o -name '*.txt' -o -name '*.c' ')' -exec grep -qF TODO {} ';' -print
Isso geraria uma lista de nomes de caminho de arquivos com esses sufixos de nome de arquivo, se os arquivos contivessem a string TODO
.
Para usar grep
em vez de find
para imprimir os nomes de caminho encontrados, altere o -exec ... -print
bit para -exec grep -lF 'TODO' {} +
. Isso será mais eficiente, especialmente se você tiver um grande número de nomes de arquivos correspondentes à (s) expressão (ns) dada (s). Em ambos os casos, você definitivamente não precisa usar ls
.
Para permitir que o usuário use
DO tex txt c
sua função pode ser alterada para
DO () {
# Allow for multiple patterns to be passed,
# construct the appropriate find expression from all passed patterns
for suffix do
set -- "$@" '-o' '-name' "*.$suffix" # only this line (and the previous) changed
shift
done
# There's now a -o too many at the start of "$@", remove it
shift
find . -type f '(' "$@" ')' -exec grep -qF 'TODO' {} ';' -print
}