Scripting

Imagen de carlosV2.0
0 puntos

Que tal?

 

Bueno, lo primero, no se si este es el foro correcto. Si no lo es, por favor, notificadmelo (e indicadme el foro correcto, plis) y eliminadlo (disculpas si no es aqui...)

 

En fin, la pregunta es sencilla:

Estoy desarrollando un script y en un momento de éste, necesito hacer esto:

echo "$( ls -l $2 | cut -d' ' -f5 )"

Para obtener el tamaño de un archivo pasado en el parametro $2 (si conoceis otra manera, os lo agradeceré). El proble es que si el archivo tiene un nombre con espacios, no me lo reconoce como un solo archivo sino como varios.

Por ejemplo. DIrectamente ejecutado desde shell:

carlos@carlos-laptop:~/Desktop$ ls -l Montar\ ISOs.odt | cut -d' ' -f5
39316

Correcto.

 

Ejecutado desde el script:

carlos@carlos-laptop:~/Desktop$ ./script C Montar\ ISOs.odt 5
./script: line 42: [: Montar: se esperaba operador binario

ls: Montar: No existe el fichero ó directorio
ls: ISOs.odt: No existe el fichero ó directorio
Errores...

 

La primera linea, viene de un condicional que verifica que $2 sea un fichero: [ ! -f $2 ]

Las siguientes lineas, son del ls -l $2

 

Como lo puedo arreglar?

He pensado una solución que seria coger el directorio de ese archivo y hacer esto:

ls -l <directorio> | grep $2 | cut -d' ' -f5

 

El problema es que no se como sacar el directorio del archivo ya que si los parametros del script son:

carlos@carlos-laptop:~/Desktop$ ./script C ./carpeta/Montar\ ISOs.odt 5

No me serviria un pwd.

 

Como puedo solucionar el problema? (También me sería útil saber solucionar el problema de la solución al problema principal (que complicao ))

 

Muchas gracias a todos los colaboradores.

 

Carlos 

Imagen de joseluis
+1
0
-1

Si quieres pasar a un script un parámetro que contiene espacios debes pasarlo encerrado entre comillas o "escapando" los espacios (con la \)

miscript "el parametro con espacios" segundoparametro

o como tú haces

miscript el\ parametro\ con\ espacios segundoparametro

Por otro lado cuando ejecutas el ls también tienes que encerrar entre comillas la variable donde está el nombre del fichero si este tiene espacios (en tu caso $2)

ls -l "$2"

Por otro lado, si tienes en una variable el nombre de un archivo junto a su ruta, puedes separarlos utilizando el comando dirname (para el path) y basename (para el nombre del fichero).
Así si tienes la variable v con el valor /home/carlos/manual de bash.txt
cuando ejecutas

directorio=`dirname "$v"`
fichero=`basename "$v"`
echo $directorio
echo $fichero

Te da como resultado

/home/carlos
manual de bash.txt

  • La guia Ubuntu - solución a muchos problemas
  • Google y el buscador de ubuntu-es son tus amigos

Fdo. El forense asesino.

+1
0
-1

Imagen de carlosV2.0
+1
0
-1

 Uooo, muchas gracias por contestar y por hacerlo tan rápido.

 

Carlos

+1
0
-1

Carlos
La solución más sencilla es probablemente la correcta (Navaja de Occam)
Hoy por ti, mañana por mi. Aprender para enseñar