Queremos grep os arquivos correspondentes que incluem algumas strings fixas e, em seguida, produzir esses arquivos apenas no formato ls -l.
Por exemplo:
A) o método a seguir com saída múltipla -exec grep e ls -l.
#
#
# find /usr/bin -type f -exec grep -Eil '#\!\/usr\/bin\/csh' {} \; -exec ls -l {} \; >scripts_csh_list 2>&1
#
#
#
# cat scripts_csh_list
/usr/bin/which
-r-xr-xr-x 1 bin bin 1191 Sep 06 2007 /usr/bin/which
#
#
B) Mas queremos a melhor saída do método apenas com ls -l ... , e então falhamos via sh -c 'grep ... {}'
Notas: todos os seguintes comandos combinados diferentes para find -exec .. .emita o mesmo resultado com falha.
#
#
# find /usr/bin -type f -exec sh -c 'grep -Eil '\/usr\/bin\/csh' {} && ls -ltr {}' \; >scripts_csh_list 2>&1t
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
#
# find /usr/bin -type f -exec sh -c ' grep -Eil '\/usr\/bin\/csh' {} ' \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
# find /usr/bin -type f -exec sh -c ' grep -Eil '\/usr\/bin\/csh' "{}" ' \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
#
# find /usr/bin -type f -exec sh -c " grep -Eil '\/usr\/bin\/csh' {} " \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
#
# find /usr/bin -type f -exec sh -c " grep -Eil '\/usr\/bin\/csh' {} " \; >scripts_csh_list 2>&1
#
#
# tail -6 scripts_csh_list
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
grep: 0652-033 Cannot open {}.
#
#
Há muito do que parece ser citação e escape desnecessários no original. Embora eu não tenha nenhum
csh
script em/usr/bin
, consegui encontrarbash
scripts e obter als
saída que você deseja com o seguinte:(Eu verifiquei isso executando sem o segundo
-exec
, por exemplo,e inspecionando os resultados.)
Para uma listagem de saída ligeiramente diferente, você também pode fazer
onde
find
as estatísticas de cada arquivo correspondente, diretamente, e retornals
resultados semelhantes.Canalizei erros
/dev/null
simplesmente para tornar as coisas mais legíveis enquanto testava; por motivos semelhantes, não canalizei a saída para um arquivo.Observe que estou usando
bash
como meu shell, então colocar agrep
expressão entre aspas simples ('...'
) foi suficiente para evitar qualquer interpretação de seu conteúdo (não que haja muito com o que se preocupar, barras (/
) não são especiais para o shell, pelo menos menos não para bash.Se você estiver usando um shell com diferentes regras de citação, YMMV.Quanto ao comando, a não ser que você use a
-o
opção,find
iráAND
reunir todos os critérios, então este rodals -l
APENAS em arquivos normais (os quetype f
você incluiu) que passam nagrep
verificação. Conforme observado nos comentários da sua pergunta,grep -q
provavelmente faz o que você deseja, que é simplesmente determinar se o arquivo em questão ({}
) corresponde ou não.EDIT: Conforme observado nos comentários, se o shell do usuário for
csh
, eles precisarão escapar da!
expressãogrep
:'#\!/usr/bin/bash'
deve funcionar.Finalmente, fizemos o seguinte método correto via sh -c 'grep ... ' com comandos find -exec. Obrigado a todos!