Estou tendo problemas com grep
a maneira de interpretar a pesquisa "recursiva" em comparação com o cp
. Talvez seja apenas que eu os use de forma diferente.
Neste, grep
parece interpretar "recursivo" de forma diferente de cp
. Isso é correto? (minha pergunta)
Por minha pergunta para navegar por isso em SO ...
Com arquivos contendo a grep
string -matched:
./file1.js
./file2.php
./inc/file3.js
./inc/file4.php
./inc.php/file5.php
grep -R "find me" *.php
Devoluções:
./file2.php
./inc.php/file5.php
...porque grep
deseja corresponder a ambos os diretórios e arquivos contendo ".php"
Mas, se eu usar cp
para copiar recursivamente, diga:
cp -r inc/* ~/mywork/
Os arquivos na pasta "inc" serão copiados, juntamente com todos os diretórios etc., embora não sejam arquivos ocultos, independentemente de terem "inc" em seu nome.
Têm grep
e cp
têm significados diferentes de "recursivo" ou tratam "recursivo" da mesma forma? Alguém poderia me ajudar a entender como diferentes argumentos de caminho/arquivo são interpretados cp
da grep
mesma maneira?
Seu
grep
comando,... contém um padrão de globbing de nome de arquivo,
*.php
. Isso será expandido pelo shell antes que o shell seja executadogrep
, então o comando real na execução pode ser algo como... onde
inc.php
passa a ser um nome de diretório.O
grep
utilitário pesquisaria os arquivos fornecidos para a expressão que você forneceu. Para diretórios mencionados na linha de comando, ele pesquisaria todos os arquivos e subdiretórios abaixo do diretório em busca de arquivos com conteúdo correspondente à expressão. Isso significa que você teria encontrado uma correspondênciainc.php/subdir/README
se esse arquivo contivesse a stringfind me
.Resumindo: Processe (procure por linhas correspondentes dentro) cada nome dado na linha de comando de acordo com as opções fornecidas (recursivamente).
O
cp
comando funciona da mesma maneira com relação a ações recursivas:O shell expandiria o comando acima para algo como
O
cp
utilitário então, para cada arquivo ou diretório nomeado individualmente, copia esse arquivo ou diretório recursivamente para o diretório de destino.Resumindo: Processe (copie para o destino) cada nome dado na linha de comando de acordo com as opções fornecidas (recursivamente).
Notas Adicionais:
O suporte
grep
para pesquisa recursiva é uma extensão não padrão.Padrões de globbing de nome de arquivo que podem se expandir para nomes que começam com um traço devem ser tratados com cuidado para não serem confundidos com opções de linha de comando. Seu
grep
comando é, portanto, escrito com mais segurança comoou como
... onde
--
delimita as opções e seus argumentos dos operandos não-opção. Seucp
comando não tem esse problema, pois o padrão globbing é garantido para expandir para algo começando com a stringinc/
.