¿Qué hay de malo con el siguiente código?
name='$filename | cut -f1 -d'.''
Como es, obtengo la cadena literal $filename | cut -f1 -d'.'
, pero si elimino las comillas no obtengo nada. Mientras tanto, escribiendo
"test.exe" | cut -f1 -d'.'
en un shell me da la salida que quiero test
,. 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.
basename $filename .exe
Haría lo mismo. Eso suponiendo que siempre sepas qué extensión deseas eliminar.basename "$filename" .exe
. De lo contrario, los nombres de archivo con espacios serían malas noticias.Respuestas:
Debe usar la sintaxis de sustitución de comandos
$(command)
cuando desee ejecutar un comando en script / command.Entonces tu línea sería
Explicación del código:
echo
obtener el valor de la variable$filename
y enviarlo a la salida estándarcut
comandocut
utilizará el. como delimitador (también conocido como separador) para cortar la cadena en segmentos y-f
seleccionamos qué segmento queremos tener en la salida$()
sustitución del comando obtendrá la salida y devolverá su valorname
Tenga en cuenta que esto proporciona la parte de la variable hasta el primer período
.
:fuente
echo $filename | cut -f1 -d'.'
$()
se prefiere.También puede usar la expansión de parámetros:
fuente
echo -n "This.File.Has.Periods.In.It.txt" | awk -F. '{$NF=""; print $0}' | tr ' ' '.' | rev | cut -c 2- | rev
. Gracias.image.png.gz
?%.*
solo eliminará la última extensión; si desea eliminar todas las extensiones, use%%.*
.Si conoce la extensión, puede usar basename
fuente
.wiki
y terminar con/home/jsmith/base
?Si su nombre de archivo contiene un punto (que no sea el de la extensión), use esto:
fuente
-s
opción dadacut
, de modo que devuelva una cadena vacía siempre que el nombre del archivo no contenga punto.usa lo que quieras. Aquí supongo que el último
.
(punto) seguido del texto es una extensión.fuente
salidas:
Tenga en cuenta que solo se elimina la última extensión.
fuente
Mi recomendación es usar
basename
.Es por defecto en Ubuntu, código visualmente simple y se ocupa de la mayoría de los casos.
Aquí hay algunos sub-casos para tratar con espacios y múltiples puntos / sub-extensión:
Por lo general, se deshace de la extensión desde el principio
.
, pero falla en nuestro..
caminoAquí hay una nota importante:
Sin embargo, aún debes pensar en
.hidden_files
no el "" resultado esperado. Para que esto suceda, use
$HOME
o/home/user_path/
porque de nuevo bash es "inusual" y no expanda "~" (busque bash BashPitfalls)
fuente
salidas:
fuente
Como señaló Hawker65 en el comentario de la respuesta de chepner, la solución más votada no se ocupa de múltiples extensiones (como filename.tar.gz), ni de puntos en el resto de la ruta (como this.path / with .dots / in.path.name). Una posible solución es:
fuente
Dos problemas con su código:
Cambiaría su código a "name =` echo $ filename | cut -f 1 -d '.' `", como se muestra a continuación (nuevamente, observe los ticks posteriores que rodean la definición de la variable de nombre):
fuente