Como usar o sed, perl para renomear arquivos e seu conteúdo com um padrão específico em um determinado diretório?

2

Dado um diretório "Centos1" que possui poucos arquivos chamados Centos1.x, Centos1.y, Centos1.z e esses arquivos também possuem "Centos1" em seus conteúdos. Usando um único comando (usando find, sed, perl -pie) como posso obtê-los renomeados para "Centos2" para todas as ocorrências de "Centos1" Aqui está o conteúdo do diretório Centos1.

Centos1.nvram      Centos1-s005.vmdk  Centos1.vmsd  vmware-2.log
Centos1-s001.vmdk  Centos1-s006.vmdk  Centos1.vmx   vmware.log
Centos1-s002.vmdk  Centos1-s007.vmdk  Centos1.vmxf
Centos1-s003.vmdk  Centos1-s008.vmdk  vmware-0.log
Centos1-s004.vmdk  Centos1.vmdk       vmware-1.log

NOTA: Eu quero que o "Centos1" seja substituído por "Centos2" dentro de todos os arquivos também, se estiver presente.

Eu executei o comando abaixo mencionado depois que mudei para o diretório "Centos1"

find . -type f -exec sed -i 's/Centos1/Centos2/g' {} +

Mas isso não ajudou. Alguma entrada?

    
por Ashutosh Narayan 27.07.2011 / 14:30

2 respostas

1

Você pode usar o comando renomear para renomear

rename Centos1 Centos2 *

ou se você tiver a renomeação de perl

rename 's/Centos1/Centos2' *

Seu comando find deve mudar todas as ocorrências de Centos1 para Centos2, para que você possa envolvê-las em um script simples para torná-lo um único comando.

#!/bin/bash
rename Centos1 Centos2 *

find . -type f -exec sed -i 's/Centos1/Centos2/g' {} +
    
por 27.07.2011 / 16:08
0

A sua resposta realmente precisa incluir apenas esses comandos, ou você pode usar built-in bash e globbing de arquivos?

for file in Centos1*; do
  sed -i 's/Centos1/Centos2/g' "$file"
  mv "$file" "$(echo "$file" | sed 's/^Centos1/Centos2/')"
done

Editar: usando apenas localizar / sed e renomear arquivos dentro

find ./ -type f -name Centos1* -exec sh -c 'sed -i "s/Centos1/Centos2/g" "$1"; mv "$1" "$(echo "$1" | sed "s/Centos1/Centos2/")"' X '{}' \;
    
por 27.07.2011 / 21:30