Existem alguns problemas no seu código:
-
O padrão
*.texserá 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\*.texao chamar a função. -
O
lsnão é necessário. Você já tem os doisfindegrepque 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
}