Como posso substituir string em todos os arquivos em um diretório e em todos os subdiretórios sem alterar nenhum dos diretórios / arquivos ocultos?

1

Estou usando o seguinte comando

find . -type f -exec sed -i 's/_backpack.html/_backpack_cal.html/g' {} +

Espero que todas as strings "_backpack.html" no meu projeto sejam substituídas por _backpack_cal.html e isso acontece.

No entanto, o problema é que ele também edita meu diretório .git que corrompe o git. Como posso evitar que o encontro toque meu diretório .git ao mesmo tempo em que trabalho com todos os outros subdiretórios

    
por Nirvedh Meshram 03.06.2015 / 19:05

3 respostas

4

Você pode usar:

find . -name .git -prune -o -type f -exec sed -i 's/_backpack.html/_backpack_cal.html/g' {} +

Adicionei a seção -name .git -prune , que basicamente significa "se o nome do diretório for .git , não processe esse diretório".

Além disso, observe o -o (significando or ) adicionado que apenas executa sua declaração se o primeiro for falso (ou seja, se o nome do arquivo processado for o diretório .git ).

Claro, você deve testar isso antes de executar o comando, substituindo a -exec ... por -print .

    
por 03.06.2015 / 19:24
0

Se você quiser excluir apenas .git :

find . ! -path '.git/*' -type f

Para excluir todos os arquivos e diretórios ocultos:

find . ! -path '*/.*' -type f
    
por 03.06.2015 / 19:23
0

Adicionar:

! -regex '.*/\.git/.*'

para pular as ocorrências de .git e seu conteúdo em todos os subdiretórios:

find . -type f ! -regex '.*/\.git/.*' -exec sed -i 's/_backpack.html/_backpack_cal.html/g' {} +
  • O ! nega a expressão que segue.
  • A expressão regular .*/\.git/.* corresponde a arquivos cujo caminho contém /.git/ .

(Como prática recomendada, antes de confiar em minha sugestão, verifique se ela realmente pula o diretório .git , por exemplo, substituindo sed por um ls inócuo:

find . -type f ! -regex '.*/\.git/.*' -exec ls -l {} \; | less

    
por 03.06.2015 / 19:08

Tags