2012-08-28 165 views
69

¿Qué pasa con el siguiente código?¿Cómo se puede eliminar la extensión de un nombre de archivo en un script de shell?

name='$filename | cut -f1 -d'.'' 

Como es, obtengo la cadena literal '$ nombre de archivo | corte -f1 -d '.' pero si elimino las citas, no obtengo nada. Mientras mecanografía

"test.exe" | cut -f1 -d'.' 

en un caparazón me da la salida que quiero, "prueba". Ya sé que $ filename se le ha asignado el valor correcto. Lo que quiero hacer es asignar a una variable el nombre del archivo sin la extensión.

+5

'basename $ filename .exe' haría lo mismo.Eso es asumiendo que siempre sabes qué extensión quieres eliminar. – mpe

+3

@mpe, te refieres a 'basename" $ ​​filename ".exe'. De lo contrario, los nombres de archivo con espacios serían malas noticias. –

Respuesta

49

Debería utilizar $ (comando) cuando desee ejecutar un comando en script/comando.

Por lo que su línea se

name=$(echo $filename | cut -f 1 -d '.') 

explicación Código:

  1. echo obtener el valor de la variable $filename y enviarlo a la salida estándar
  2. A continuación, cogemos la salida y el tubo se al comando cut
  3. El cut usará el. como delimitador (también conocido como separador) para cortar la cadena en segmentos y por -f seleccionamos qué segmento que queremos tener en la producción
  4. A continuación, la envoltura $() obtendrá la salida y devolver su valor
  5. El valor devuelto será asignado a la variable llamada name
+0

Gracias. También noté que necesito usar el comando echo. name = 'echo $ filename | corte -f1 -d '.' ' – mimicocotopus

+0

@mimicocotopus oh sí, pasé por alto esa parte, gracias. – Rohan

+11

Backpoints están en desuso por POSIX, '$()' es preferido. – jordanm

111

también puede utilizar la expansión de parámetros:

$ filename=foo.txt 
$ echo "${filename%.*}" 
foo 
+3

aquí la explicación del comando: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html –

+1

Y aquí estaba a punto de usar 'echo -n" This.File.Has.Periods.In.It.txt "| awk -F. '{$ NF = ""; imprimir $ 0} '| tr '' '.' | rev | corte -c 2- | rev' Gracias. – user208145

63

Si conoce la extensión, puede utilizar basename

$ basename /home/jsmith/base.wiki .wiki 
base 
12

Si el nombre de archivo contiene un punto (que no sea el de la extensión) a continuación, utilizar esto:

echo $filename | rev | cut -f 2- -d '.' | rev 
+0

Olvidé el rev del medio, pero una vez que lo vi, ¡fue genial! –

11
file1=/tmp/main.one.two.sh 
t=`basename $file1`       # output is main.one.two.sh 
name=`echo $file1 | sed -e 's/\.[^.]*$//'` # output is /tmp/main.one.two 
name=`echo $t | sed -e 's/\.[^.]*$//'`  # output is main.one.two 

usar en cada momento que desee. Aquí supongo que el último. (Punto) seguido por el texto es la extensión.

0

Dos problemas con su código:

  1. ha utilizado un '(garrapata) en lugar de un `(espalda garrapata) para rodear los comandos que generan la cadena que desea almacenar en la variable.
  2. Usted no "repitió" la variable "$ filename" al conducto en el comando "cortar".

Cambiaría el código a "name =` echo $ filename | cut -f 1 -d '.' `", como se muestra a continuación (una vez más, fíjese en los últimos tics que rodean la definición de variable de nombre):

$> filename=foo.txt 
$> echo $filename 
foo.txt 
$> name=`echo $filename | cut -f1 -d'.'` 
$> echo $name 
foo 
$> 
Cuestiones relacionadas