Editar recursivamente arquivos baseados no nome do diretório pai

1

Estou enfrentando um problema que não sei ao certo como superar. Eu tenho um grande diretório com centenas de pastas, todas seguindo o esquema de nomenclatura "a_b_x", com x sendo uma palavra aleatória. Em cada uma dessas pastas há 3 arquivos de texto, todos com algumas strings contendo "a_b_x" também.

Estou tentando renomear todos os diretórios e alterar as sequências dentro dos arquivos de "a_b_x" para "a_x", o que significa que o "b_" deve ser removido. Espero conseguir isso com alguma magia sed, já que editar manualmente todos os arquivos levaria várias horas.

Eu ficaria muito grato por qualquer ajuda!

    
por naosia 19.02.2013 / 10:33

3 respostas

-1

Você pode usar este comando:

for folder in $(ls); do
    for file in $(ls $folder); do
        sed -i 's/_b//' $folder/$file
    done
    mv $folder ${folder/_b/}
done
  • O primeiro loop está navegando em diretórios.
  • O segundo loop está editando o conteúdo dos arquivos localizados nas pastas.

    Depois de deixar o segundo loop, o primeiro é renomear as pastas.

Outra maneira de lidar com espaços em nomes de arquivos que seriam interpretados como IFS:

ls | while read folder ; do
 ls "$folder" | while read file; do
  sed -i 's/_b//' "$folder/$file"
 done
 mv "$folder" "${folder/_b/}"
done
    
por 19.02.2013 / 11:41
1

Você deve sempre evitar analisar a saída de ls . Tente isso (graças a stephane-chazelas por sugerir ./*/ ):

for folder in ./*/; do     
      sed -i 's/_b//g' "$f"/*; mv "$folder" "${folder/_b/}"; 
 done
    
por 19.02.2013 / 12:30
1

Aqui você está

root@testbox:~# mkdir test
root@testbox:~# cd test
root@testbox:~/test# mkdir -p a_b_x{1..10} # populate directories
root@testbox:~/test# printf 'a_b_x\na_b_y\nfoo\nbar\n' | \
    tee a_b_x{1..10}/somefile # populate files
a_b_x
a_b_y
foo
bar

Renomear diretórios:

root@testbox:~/test# find . -name a_b_\* -type d -print0 | \
    xargs -r0 rename -v 's/a_b_/a_/'
./a_b_x10 renamed as ./a_x10
./a_b_x5 renamed as ./a_x5
./a_b_x7 renamed as ./a_x7
./a_b_x4 renamed as ./a_x4
./a_b_x8 renamed as ./a_x8
./a_b_x3 renamed as ./a_x3
./a_b_x9 renamed as ./a_x9
./a_b_x6 renamed as ./a_x6
./a_b_x1 renamed as ./a_x1
./a_b_x2 renamed as ./a_x2

Editar arquivos:

root@testbox:~/test# find . ! -name \*.bak -type f -print0 | xargs -r0 sed -i.bak 's,a_b_,a_,'
root@testbox:~/test# cat a_x4/somefile
a_x
a_y
foo
bar

Remova os backups se tudo estiver ok:

root@vm8583:~/test# find . -name \*.bak -type f -delete
    
por 19.02.2013 / 21:46