Como renomear tudo que corresponda a uma determinada string em uma pasta

3

Estou executando o Linux e tenho alguns conhecimentos básicos sobre consoles, mas meu problema atual é bastante difícil e não sei como conseguir isso.

Eu quero / preciso renomear tudo dentro de uma pasta que corresponda a uma determinada string. Por tudo que eu quero dizer

  • pastas / arquivos
  • conteúdo dentro de um arquivo
  • conteúdo em arquivos ocultos

Basicamente, quero refatorar um projeto Java. Claro, eu poderia usar o Eclipse para lidar com a substituição, mas isso deixa de fora as pastas ou recursos fora do meu espaço de trabalho.

Eu estava pensando em um script que poderia fazer o trabalho para mim, mas isso parece um pouco complicado. Por exemplo, quando se trata de renomear pastas / arquivos, eu quero substituir apenas a parte do nome que corresponde à minha string, o restante deve permanecer intocado.

Talvez alguém já tenha algo assim em sua coleção de scripts: -)

Obrigado antecipadamente

Marc

    
por user4747 19.05.2010 / 23:38

2 respostas

2

Você precisará fazer isso em várias etapas

  1. Gerar lista de arquivos contendo a string que você deseja alterar (por exemplo, find mydir -type f -print | xargs egrep <searchstring> )
  2. Para cada um desses arquivos, faça as substituições (por exemplo, | while read fn; do sed 's/searchstring/replacement/g' $fn >/tmp/foo && mv /tmp/foo $fn; done )
  3. Agora, encontre nomes de diretório para alterar (por exemplo, find mydir -type d -print | egrep <searchstring> )
  4. e alterá-los (por exemplo, | while read olddir; do newdir=echo $olddir | sed 's/searchstring/replacement/g'; mv $olddir $newdir; done ) (deve haver backtics em torno da atribuição echo newdir newdir; agradeço um comentário sobre como incluir backtics em um segmento de código in-line)
  5. E agora nomes de arquivos, já que os nomes dos diretórios não serão alterados. Muito semelhante à alteração do diretório, apenas o find inicial deve ser -type f

Isso deve ser o suficiente para você seguir em frente.

    
por 20.05.2010 / 03:00
2

Um jeito rápido e sujo de fazer isso pode ser:

  1. Obtenha uma lista de todos os arquivos que correspondem ao seu padrão

    # find /path -name \*pattern\* > filelist
    
  2. Itere através da lista de arquivos com um script de shell, fazendo o que você quiser em cada linha:

    #!/bin/sh
    
    for I in 'cat filelist'
    do
         # for renaming, use mv
         mv $I new.file.name
    done
    
por 20.05.2010 / 01:35