[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: script para renombrar archivos vía ssh no me funciona (creo que son las '"')



> for ii in *.conf; do ( dest=$(echo $ii|sed -e 's/z01_//'); echo mv -fv
> $ii//$dest; ) done
> for ii in *.conf; do ( dest=$(echo $ii | tr -d 'z01_'); echo mv -fv
> $ii//$dest; ) done
> for ii in *.conf; do ( dest=$(echo $ii | awk -v a="z01_"
> '{gsub(a,"",$0); print  $0}'); echo  -fv $ii -- $dest; ) done
Primero que nada, te recomiendo que evites la forma:

  var=$(echo "$var" | comando)

Por varias razones:

1) «echo "$var"» falla para ciertos valores de "$var", y el comando
 echo varía de shell a shell. Unos interpretan los \n otros no, etc.
2) Siempre, siempre, protege una expansión de variable con comillas
 dobles. «"$var"» -> bien, «$var» -> mal. A menos de que realmente
 sepas lo que estás haciendo y conozcas las implicaciones de no
 hacerlo (que se partirá en múltiples palabras según la variable IFS
 y también expandirá los patrones como * y ?)
3) La diferencia entre "..." y '...' es que "..." permite expansiones
 de variables y también sustituciones de comandos «$(foo)». '...' no
 permite absolutamente nada, ni siquiera una comilla sencilla.

> ssh user@hostremto  "cd /path; for ii in *.conf; do ( dest=$(echo
> \$ii|sed -e 's/z01_//'); echo  -fv \$ii//\$dest; ) done"
Como comentaba otro listero, al usar "..." las expansiones $(...) se
ejecutan en la shell local, no en la remota. Tienes que proteger el
comando que mandas a SSH con comillas sencillas para evitar este
problema.

> como que no toma el remplazo de 'z01_' por '', la verdad que luego de
> horas de probar diferentes combinaciones de he desistido.
> Tengo un error de concepto?  como debería castear las comillas para
> hacer que funcione?

Mira, abajo te dejo una opción que puedes usar, con una demostración
de que funciona:

  $ ssh "$host" 'mkdir -p foo/bar; touch foo/bar/z01_configuraMusica{1..5}.conf';
  $ ssh "$host" 'cd foo/bar; for file in *.conf; do echo mv "$file" "${file#*_}"; done'
  mv z01_configuraMusica1.conf configuraMusica1.conf
  mv z01_configuraMusica2.conf configuraMusica2.conf
  mv z01_configuraMusica3.conf configuraMusica3.conf
  mv z01_configuraMusica4.conf configuraMusica4.conf
  mv z01_configuraMusica5.conf configuraMusica5.conf

Cuando verifiques que hace lo que quieres, quita el echo. Para
entender qué hace la expansión «${file#*_}», debes saber que a estas
expansiones se les llaman expansiones de parámetros, y son nativas al
shell. Lo que hace la expansión ${var#patrón} en específico es
remover «patrón» del inicio de la variable "$var", así que si tienes:

var=hola; echo "${var#ho}", el resultado será «la». En nuestro caso, usamos el
patrón *_, que significa, quita hasta el primer «_», y todo lo que
está antes. Otra forma de hacerlo habría sido: "${file#z01_}", si
quieres ser más explícito.

-- 
Eduardo Alan Bustamante López


Reply to: