Dada una ruta de archivo de cadena como "/foo/fizzbuzz.bar", ¿cómo usaría bash para extraer solo la parte "fizzbuzz" de dicha cadena?¿Cómo elimino el sufijo del archivo y la porción de ruta de una cadena de ruta en Bash?
Respuesta
Así es como hacerlo con el signo # y% operadores en Bash.
$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz
${x%.bar}
también podría ser ${x%.*}
para eliminar todo después de un punto o ${x%%.*}
para eliminar todo después de que el primer punto.
Ejemplo:
$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz
documentación se puede encontrar en el Bash manual. Busque ${parameter%word}
y ${parameter%%word}
sección de coincidencia de la parte posterior.
vistazo a la orden nombre base:
NAME=`basename /foo/fizzbuzz.bar .bar`
Probablemente la más simple de todas las soluciones actualmente ofrecidas ... aunque usaría $ (...) en lugar de backticks. –
Más simple, pero agrega una dependencia (no es una gran ni extraña, lo admito). También necesita saber el sufijo. –
Y se puede usar para eliminar cualquier cosa del extremo, básicamente solo hace una extracción de cadena desde el final. – Smar
forma pura fiesta:
~$ x="/foo/bar/fizzbuzz.bar.quux.zoom";
~$ y=${x/\/*\//};
~$ echo ${y/.*/};
fizzbuzz
Esta funcionalidad se explica en el manual de bash en "la expansión de parámetro". Abundan las formas no bash: awk, perl, sed, etc.
EDIT: funciona con los puntos en el archivo sufijos y no necesita saber el sufijo (extensión), pero no se trabajo con puntos en el nombre sí .
perl -pe 's/\..*$//;s{^.*/}{}'
El nombre base y funciones dirname son lo que está buscando:
mystring=/foo/fizzbuzz.bar
echo basename: $(basename $mystring)
echo basename + remove .bar: $(basename $mystring .bar)
echo dirname: $(dirname $mystring)
tiene una salida:
basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo
El uso de basename
asume que usted sabe cuál es la extensión del archivo, ¿no es así?
Y creo que las diversas sugerencias de expresiones regulares no resuelven un nombre de archivo que contiene más de un "."
Lo siguiente parece hacer frente a los puntos dobles. Ah, y los nombres de archivo que contienen una "/" a sí mismos (sólo por diversión)
Parafraseando a Pascal, "Lo sentimos, este guión es tan larga. No he tenido tiempo para hacerla más corta"
#!/usr/bin/perl
$fullname = $ARGV[0];
($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
print $basename . "\n";
Esto es bueno y robusto –
Si no puede usar el nombre base como se sugiere en otras publicaciones, siempre puede usar sed. Aquí hay un ejemplo (feo). No es el mejor, pero funciona extrayendo la cadena deseada y reemplazando la entrada con la cadena deseada.
echo '/foo/fizzbuzz.bar' | sed 's|.*\/\([^\.]*\)\(\..*\)$|\1|g'
que le llevará la salida
FizzBuzz
Aunque esta es la respuesta a la pregunta original, este comando es útil cuando tengo líneas de rutas en un archivo para extraer los nombres base para imprimirlos en la pantalla. –
El nombre base hace eso, elimina la vía. También eliminará el sufijo si está dado y si coincide con el sufijo del archivo pero necesitaría saber el sufijo para darle al comando. De lo contrario, puede usar mv y descubrir cuál es el nuevo nombre de otra manera.
Tenga cuidado con la solución Perl sugerida: elimina cualquier cosa después del primer punto.
$ echo some.file.with.dots | perl -pe 's/\..*$//;s{^.*/}{}'
some
Si quiere hacerlo con el Perl, esto funciona:
$ echo some.file.with.dots | perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'
some.file.with
Pero si está usando Bash, las soluciones con y=${x%.*}
(o basename "$x" .ext
si conoce la extensión) son mucho más simple.
Utilizando nombre base que utiliza lo siguiente para lograrlo:
for file in *; do
ext=${file##*.}
fname=`basename $file $ext`
# Do things with $fname
done;
Esto no requiere ningún conocimiento a priori de la extensión de archivo y funciona incluso cuando se tiene un nombre de archivo que tiene puntos en que es nombre de archivo (en frente de ella es extensión); sin embargo, requiere el programa basename
, pero esto es parte de los coreutils de GNU, por lo que debe enviarse con cualquier distribución.
¡Excelente respuesta! elimina la extensión de una manera muy limpia, pero no elimina el. al final del nombre de archivo. – metrix
@metrix acaba de agregar el "." antes $ ext, es decir: 'fname = \' nombre base $ archivo. $ ext \ '' –
fiesta puro, hecho en dos operaciones separadas:
elimine la ruta de un camino de cuerdas:
path=/foo/bar/bim/baz/file.gif file=${path##*/} #$file is now 'file.gif'
eliminar la extensión de una ruta de cuerdas:
base=${file%.*} #${base} is now 'file'.
Combinando la t op-respuesta nominal con la respuesta de segundo más altas calificaciones para obtener el nombre del archivo sin la ruta completa:
$ x="/foo/fizzbuzz.bar.quux"
$ y=(`basename ${x%%.*}`)
$ echo $y
fizzbuzz
informaciones que puede encontrar en Bash manual, busque ${parameter%word}
y ${parameter%%word}
en la sección posterior a juego porción.
- 1. ruta del archivo como argumento ruta MVC
- 2. Determinar la ruta del script BASH ejecutar
- 3. Obtener la ruta del archivo de una imagen en ImageView
- 4. Obtener solo el nombre de archivo de una ruta en una secuencia de comandos Bash
- 5. android dibujable desde la ruta del archivo
- 6. Ruta del archivo de propiedades en java
- 7. Desinfectar la ruta del archivo en PHP
- 8. ¿Cómo obtener la ruta del servidor de la ruta física?
- 9. Creando una ruta de archivo en C#
- 10. ¿Cómo obtener la ruta absoluta de la ruta con variables de ruta del sistema?
- 11. Eliminar la extensión de archivo y la ruta de una cadena en Perl
- 12. VBA Powerpoint. ¿Cómo obtener la ruta del directorio actual del archivo a una cadena en VBA?
- 13. ¿Cómo obtener la ruta absoluta del archivo desde la ruta base y relativa que contiene ".."?
- 14. extraer nombre de archivo de la ruta
- 15. Obtener la ruta del archivo en ASP.NET y XDocument.Load
- 16. Ruta del archivo desde una cámara usb
- 17. Recuperando la ruta de instalación del archivo desde el registro
- 18. ¿Cómo calcula MediaWiki la ruta del archivo a una imagen?
- 19. Eliminar ruta del nombre de archivo
- 20. Ruta del archivo/nombre de InputStream
- 21. ANT: ¿Cómo "agregar" elementos de ruta de una ruta a una segunda ruta?
- 22. Usando la variable de entorno en una ruta de archivo
- 23. ¿Cómo encontrar la ruta completa del archivo .pst de Outlook?
- 24. Drive de ruta del archivo tipo de URI en C#
- 25. Ruta de acceso personalizada del archivo user.config
- 26. ¿Cómo extraer el nombre del archivo del nombre de la ruta del archivo?
- 27. Buscar nombre de archivo de la ruta de archivo completo
- 28. ¿Cómo ocultar la ruta del archivo en la URL?
- 29. gcc - cómo encontrar la ruta del encabezado, incluye el archivo
- 30. ¿Cómo obtener la ruta del archivo desde el URI?
Terminé usando este porque era el más flexible y había un par de cosas similares que quería hacer, así que me fue muy bien. –
Esta es probablemente la más flexible de todas las respuestas publicadas, pero creo que las respuestas que sugieren los comandos basename y dirname también merecen algo de atención. Ellos pueden ser el truco si no necesita ninguna otra coincidencia de patrón de lujo. – mgadda
¿Cómo se llama esto $ {x% .bar}? Me gustaría aprender más al respecto. – Basil