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.

Mate
fuente

Respuestas:

203
dirname $file

es lo que estas buscando

Matthieu
fuente
+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
matchew
fuente
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! :-)

MageParts
fuente
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}
Urvin Shah
fuente
1

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

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

Nishchay Sharma
fuente