Linux / Comando / dirname: extraer la parte de directorio de una ruta
dirname es un comando que elimina el último nombre de archivo o directorio de una cadena de ruta y muestra la parte de directorio anterior. Es útil en scripts de shell para obtener la ruta superior de un archivo o para dividir y procesar rutas junto con basename.
dirname no explora realmente el sistema de archivos ni verifica la existencia del directorio superior. Aplica reglas definidas a la cadena de entrada, por lo que si se necesita una ruta absoluta real o la resolución de enlaces simbólicos, se debe usar un comando como realpath.
¿Qué hace el comando dirname?
Para obtener la parte de la ruta sin el último componente, se ejecuta de la siguiente manera.
dirname /home/user/report.txt
La salida es la siguiente.
/home/user
No se verifica si el último nombre ingresado es realmente un archivo o directorio. Es un simple procesamiento de cadenas, por lo que la misma regla se aplica incluso a rutas que no existen.
Sintaxis y uso básico
dirname NOMBRE ...
GNU dirname puede recibir varias rutas y mostrar el resultado de cada una en una línea.
dirname /var/log/nginx/access.log
dirname /home/user/Documents/
dirname relative/path/file.txt
Los resultados generales son /var/log/nginx, /home/user y relative/path, respectivamente. La barra final y las barras consecutivas pueden variar durante el proceso de normalización, por lo que no se debe usar para preservar la cadena original tal cual.
Resultados según el tipo de entrada
| Entrada | Salida común |
|---|---|
/home/user/report.txt |
/home/user |
docs/manual.pdf |
docs |
notes.txt |
. |
/usr/ |
/ |
/ |
/ |
Nombre sin barra diagonal
Si la entrada no tiene barra diagonal, se imprime un punto que indica el directorio actual.
dirname report.txt
.
Este resultado no significa que un archivo llamado report.txt realmente exista en el directorio actual, sino que representa la parte del directorio en la cadena de entrada.
Ruta absoluta y ruta raíz
Si se elimina el último componente de una ruta absoluta y solo queda la raíz, se imprime /.
dirname /etc
dirname /
Ambos comandos normalmente imprimen /. Incluso si se representa la cadena del padre de la raíz, sigue siendo la raíz misma.
Barra diagonal al final de la ruta
La barra al final innecesaria se elimina primero y luego se procesa el último componente.
dirname /srv/www/site/
dirname /srv/www/site///
Ambas entradas normalmente producen /srv/www. No es adecuado para tareas que requieren mantener el número de barras en el original o la barra final.
Procesar varias rutas
Especificar varios nombres a la vez
En la implementación de GNU, se pueden enumerar varias rutas.
dirname /srv/www/index.html /var/log/syslog /home/user/file.txt
Se imprime una línea correspondiente a la parte del directorio de cada entrada.
/srv/www
/var/log
/home/user
Separar con caracteres NUL con -z
En automatizaciones donde los nombres de archivo pueden contener saltos de línea, se puede separar los resultados con un carácter NUL usando -z o --zero.
dirname -z /srv/www/index.html /var/log/syslog
Esta opción es una extensión de GNU, así que si se necesita ejecutar en otros sistemas tipo Unix, verifique la compatibilidad.
Uso conjunto de dirname y basename
Se puede extraer por separado la parte del directorio y el último nombre de una ruta.
path='/home/user/docs/report.pdf'
directory=$(dirname -- "$path") || exit 1
name=$(basename -- "$path") || exit 1
printf 'Directorio: %s\n' "$directory"
printf 'Nombre: %s\n' "$name"
La salida tiene la siguiente forma.
Directorio: /home/user/docs
Nombre: report.pdf
Los dos comandos separan partes de la ruta, pero no garantizan reconstruir exactamente sus barras originales. Además, $(...) elimina los saltos de línea finales; si necesita conservar nombres que terminen en salto de línea, utilice un flujo delimitado por NUL sin esta captura.
Uso en scripts de shell
Crear el directorio superior del archivo de salida
Se puede preparar el directorio superior antes de crear el archivo.
output='/srv/backups/daily/archive.tar.gz'
output_dir=$(dirname -- "$output") || exit 1
mkdir -p -- "$output_dir"
El ejemplo usa /srv/backups/daily/archive.tar.gz como ruta ficticia. No lo ejecute sin adaptar el destino y comprobar los permisos; para practicar, utilice una carpeta propia. mkdir -p crea los directorios que falten, pero no el archivo final. Si la entrada no es confiable, compruebe que la ruta resultante permanezca dentro de la base autorizada: dirname no impone esa restricción.
Comparación con la expansión de parámetros del shell POSIX
Si es una entrada sencilla, se puede eliminar la última parte después de la barra con la expansión de parámetros del shell.
path='/srv/www/index.html'
directory=${path%/*}
printf '%s\n' "$directory"
Pero con nombres sin barra, la ruta raíz o una ruta con barra al final, los resultados pueden diferir de dirname. Si los formatos de entrada son diversos, pruebe suficiente las excepciones de la expresión de expansión que haya creado.
Diferencias entre dirname, realpath y pwd
| Comando | Objetivo de procesamiento | Resultados principales |
|---|---|---|
dirname |
Cadena de ruta ingresada | Cadena sin el último nombre |
basename |
Cadena de ruta ingresada | Último nombre de archivo o directorio |
realpath |
Ruta y sistema de archivos especificados | Ruta normalizada o con enlaces simbólicos resueltos |
pwd |
Ubicación de trabajo del proceso actual | Ruta absoluta del directorio de trabajo actual |
dirname ../logs/app.log imprime ../logs como una cadena. No convierte esto en una ruta absoluta basada en la ubicación actual ni interpreta enlaces simbólicos.
Resumen de opciones principales
| Opciones | Descripción |
|---|---|
-z, --zero |
Finaliza cada resultado con un carácter NUL en lugar de un salto de línea. |
--help |
Imprime el modo de uso y las opciones de soporte. |
--version |
Imprime la versión de GNU Coreutils instalada. |
-- |
Los argumentos posteriores se tratan como nombres, no como opciones. |
Problemas comunes
El resultado se imprime como un solo punto
Porque el nombre de entrada no contiene una barra. El resultado de dirname file.txt, ., representa el directorio actual desde una perspectiva de cadena.
El directorio superior en realidad no existe
dirname no examina el sistema de archivos. Para usar el directorio impreso realmente, se debe verificar por separado si existe y los permisos de acceso.
La ruta con espacios o comodines se rompe
Use comillas dobles para encerrar variables y use -- antes de valores que pueden comenzar con un guion.
dirname -- "$path"
FAQ
¿dirname encuentra realmente el directorio superior?
No. Solo elimina el último componente de la cadena de ruta ingresada y no verifica la existencia real de la ruta ni enlaces simbólicos.
¿Por qué dirname file.txt imprime un solo punto?
Porque no hay barras que separen directorios en la entrada, se imprime . para representar el directorio actual.
¿Se pueden procesar varias rutas a la vez?
GNU dirname acepta múltiples rutas como argumentos y muestra cada resultado. Si necesita portabilidad con otras implementaciones de Unix, verifique primero los formatos compatibles.
¿Se puede usar dirname si se necesita una ruta absoluta?
dirname no convierte las rutas relativas en rutas absolutas. Si necesita una ruta absoluta normalizada, utilice la opción realpath correspondiente a su propósito.
Para comparar otras herramientas, consulte la Lista de comandos de uso frecuente en Linux. Para consultar las reglas y opciones, use Documentación oficial de GNU Coreutils dirname y Especificación POSIX de dirname.




