Extraer directorio de la ruta


123

En mi script necesito el directorio del archivo con el que estoy trabajando. Por ejemplo, el archivo = "cosas / copia de seguridad / archivo.zip" . Necesito una forma de obtener la cadena " cosas / copia de seguridad / " de la variable $file.

Respuestas:


203
dirname $file

es lo que estas buscando


+1, adelantame. hubiera sido más rápido, pero se le pidió que ingresara más dedirname $file
matchew

1
dirname "$file", más bien. Sin las comillas, esto se comportará mal si el nombre del archivo o directorio tiene espacios.
Charles Duffy

fml, la pregunta debería ser extraer el directorio absoluto del archivo, ¿cómo hago eso? dirname produce una ruta relativa, supongo
Alexander Mills

Es asombroso lo difícil que es lograr esto en un script win Batch, ¡otra razón para no usarlos, supongo!
bunkerdive

47
dirname $file

saldrá

stuff/backup

que es lo contrario de basename:

basename $file

saldría

file.zip

Supuse que Matt podría descifrarlo a partir de ahí (man dirname) :)
Matthieu

1
Creo que todos somos Matt aquí. Solo una suposición. Pero solo estaba tratando de distinguir mi respuesta de la tuya. =)
matchew

Sí, también uso mucho el nombre de base, es muy ingenioso =) ¡Pero no pude encontrar nada sobre cómo devolver el directorio del archivo en Google! Supongo que no buscaba las palabras adecuadas. ¿Los 3 de Matt? : D
Matt

1
Considere agregar las comillas necesarias para asegurarse de que estos comandos funcionen con nombres que contengan espacios (caracteres globales, etc.).
Charles Duffy

3

Usar lo ${file%/*}sugerido por Urvin / LuFFy es técnicamente mejor ya que no dependerá de un comando externo. Para obtener el nombre de base de la misma manera que podría hacerlo ${file##*/}. No es necesario utilizar un comando externo a menos que sea necesario.

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

De esta manera, también sería totalmente compatible con POSIX. ¡Espero eso ayude! :-)


1
Hay un caso en el que dirnametiene una ventaja sobre el enfoque integrado (más eficiente), y es si no está seguro de que su camino esté completamente calificado para comenzar. Si tiene file=file.zip, dirname "$file"volverá ., mientras ${file%/*}que volverá file.zip.
Charles Duffy

1
... por supuesto, puede bifurcar: case $file in */*) dir=${file%/*};; *) dir=.;; esacsigue siendo POSIX-y y resuelve el problema.
Charles Duffy

2

Para obtener directorypathde filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}

1

Simplemente use $ dirname /home/~username/stuff/backup/file.zip

Volverá /home/~username/stuff/backup/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.