Digamos que estou em um diretório A, em A há muitas pastas (B, C, D, etc.) e em cada pasta há um arquivo "*.out" e subpastas. Desejo executar um script de A que procurará o texto "index123" no arquivo *.out e imprimirá todos os nomes de pastas correspondentes.
Aqui está o meu roteiro:
#!/bin/sh
FILES=home/A
grep --include=\*.out -rnw $FILES -e "index123" | while read file; do
str1="FILES/$(basename $file)"
echo $str1
done
Isso mostra erro.
NB Isso pode ser feito por "encontrar" em um código de linha, mas por que o loop while mostrado mostra erro?
Supondo uma estrutura de diretório como a seguinte:
O problema com seu código é que você
grep
produzirá uma saída que se parece comEssa é a saída de
com
A
o diretório atual.Você tentará executar
basename
nessas linhas individuais, o que falha, poisbasename
leva no máximo dois argumentos (um caminho e um sufixo para retirar desse nome de caminho). O GNUbasename
reclamará de um "operando extra", enquantobasename
o BSD reclamará do uso incorreto.grep
mostrará os nomes dos arquivos (apenas, ou seja, não a linha completa correspondente) quando você o usar com o-l
sinalizador.Isso significa que seu script pode ser substituído pelo único comando
Isso dará saída no formulário
Eu adicionei
-w
como você usou em suagrep
linha de comando.-n
(para numerar linhas, que você também está usando) não pode ser usado junto com-l
.A julgar pelo seu código, é isso que você deseja.
Se você precisar apenas dos nomes das pastas, faça
Tudo isso pressupõe que
A
seja o diretório de trabalho atual, mas você disse que esse era o caso na pergunta, portanto não deveria ser um problema.De acordo com a postagem, encontre um arquivo por meio de uma pesquisa específica no loop while, uma das soluções pode ser a seguinte usando o
while
loop:#!/bin/bash
while IFS= read -r d;
grep -q "index123" "$d" && dirname "$d"|awk -F'/' '{print $2}'
done < <(find . -maxdepth 2 -type f -name "*.out")