Renomeia arquivos e diretórios com caracteres especiais em máquinas solaris

0

O alvo do seguinte código (comandos) é renomear arquivos / diretórios e também suportar arquivos / diretórios com caracteres especiais como "@" ou "." etc

esses comandos são executados no Linux sem problemas,

 export NAME_THAT_WE_WANT_TO_CHANGE='.com'
 export NEW_NAME='@google'
 find /tmp -name '*.com*' -print0 | xargs -0  ./rename.pl   's/\Q$ENV{NAME_THAT_WE_WANT_TO_CHANGE}\E/$1$ENV{NEW_NAME}$2/'

por exemplo, os arquivos

/tmp/star.com 
/tmp/public.com

será substituído depois de executar o comando abaixo para

/tmp/star@google 
/tmp/public@google

agora eu estou tentando converter a sintaxe de localização para suportar máquinas Solaris (Solaris 10)

e isso que eu escrevo para o Solaris:

  export NAME_THAT_WE_WANT_TO_CHANGE='.com'
  export NEW_NAME='@google'

  find /tmp -name '*.com*' -exec ./rename.pl  {} + 's/\Q$ENV{NAME_THAT_WE_WANT_TO_CHANGE}\E/$1$ENV{NEW_NAME}$2/'

mas quando eu corro a linha de localização ... (recebo os seguintes erros)

find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

por favor, avise-me o que eu preciso corrigir na minha sintaxe, a fim de apoiar máquinas solaris?

  • Sobre o script rename.pl do qual tirei ( link )

     more /tmp/rename.pl
     #!/usr/bin/perl
     #
     # rename script examples from lwall:
     #       rename 's/\.orig$//' *.orig
     #       rename 'y/A-Z/a-z/ unless /^Make/' *
     #       rename '$_ .= ".bad"' *.f
     #       rename 'print "$_: "; s/foo/bar/ if <stdin> =~ /^y/i' *
    
     $op = shift;
     for (@ARGV) {
     $was = $_;
     eval $op;
     die $@ if $@;
     rename($was,$_) unless $was eq $_;
     }    
    
por yael 11.03.2013 / 14:31

1 resposta

1

Os parâmetros {} \; e {} + funcionam apenas no fim do comando, da mesma forma que xargs funciona.

Este não é um problema do Solaris.

Os exemplos dentro de rename.pl mostram claramente os nomes dos arquivos no final do comando.

Tente:

find /tmp -name '*.com*' -exec ./rename.pl  \
  's/\Q$ENV{NAME_THAT_WE_WANT_TO_CHANGE}\E/$1$ENV{NEW_NAME}$2/' {} +

"@" e "." Não conte um caractere especial neste contexto. Você precisa de find -print0 e xargs -0 para lidar de maneira robusta com todos os nomes de arquivos (por exemplo, com novas linhas incorporadas no nome). Você também pode usar o mesmo método find ...| xargs ... no Solaris, embora sem as opções "0", a menos que você instale os findutils do GNU e use gfind e gxargs como também sugerido por @vonbrand.

    
por 11.03.2013 / 16:42