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.