Eu tenho zilhões de diretórios dentro de um diretório principal. Cada um desses diretórios tem vários níveis de subdiretórios. Espalhados entre eles, existem arquivos chamados Info.plist
.
Dentro desses Info.plist
arquivos, existem linhas de linha estas:
<string>/Users/Shared/Library/Mail/V7/74309-67B6-44E3-BD66-9384D1E54398/Junk.mbox</string>
essas linhas, que podem ser uma ou várias por arquivo, podem ser diferentes, como
<string>/Users/Shared/Library/Mail/V7/74398/Junk.mbox</string>
<string>/Users/Shared/Library/Mail/V7/7-67B8/Sent.mbox</string>
<string>/Users/Shared/Library/Mail/V7/OLD/Old.mbox</string>
Estou interessado em localizar essas linhas dentro desses Info.plist
arquivos e alterar a Shared
parte para Fireball
.
Assim, a linha anterior se tornará
<string>/Users/Fireball/Library/Mail/V7/74398/Junk.mbox</string>
<string>/Users/Fireball/Library/Mail/V7/7-67B8/Sent.mbox</string>
<string>/Users/Fireball/Library/Mail/V7/OLD/Old.mbox</string>
Mantendo o resto como estão.
Então, primeiro eu tenho que escanear uma estrutura de diretórios recursiva, localizar todos os Info.plist
arquivos que eles possuem, escanear dentro de cada um Info.plist
para a palavra- Shared
chave se eles forem usados em um caminho e mudar isso para Fireball
.
Como faço isso usando algum comando unix mágico?
estou mexendo com isso
find . -type f -name Info.plist -exec sed 's/Shared/Fireball/g' {} +
Isso quase parece estar funcionando, pois imprime para consolar as alterações corretas, mas os arquivos não são alterados.
Supondo que você
sed
suporte o-i
sinalizador para edição no local (a maioria dos que você provavelmente encontrará em um sistema operacional convencional), você pode fazer:Se não, você pode tentar
perl
em vez disso:Apenas certifique-se de que cada instância da string
Shared
é aquela que você deseja substituir. Pode ser mais seguro usar um pouco mais do caminho, apenas para garantir:comando
resultado