El comando ls hace una cosa sencilla — listar el contenido de un directorio — pero la mayoría de la gente solo usa la versión sin argumentos y se pierde la mitad de la información disponible. El formato largo (-l) es donde ls pasa de ser un listado plano a una vista real del estado del sistema de archivos: permisos, propietario, tamaño, fecha. Todo en una línea por entrada.
Internamente, ls llama a stat() por cada entrada del directorio para obtener los metadatos del inodo. Por eso -l es más lento que un ls simple en directorios con miles de archivos: no es solo leer nombres, es hacer una llamada al sistema por archivo. El diseño de separar el listado rápido del detallado es deliberado.
Cuándo usarlo de verdad: cuando llegas a un directorio desconocido en producción, lo primero que haces es ls -lah. Necesitas saber qué hay ahí, quién lo posee, cuánto ocupa y cuándo se tocó por última vez. Si estás en un directorio de logs y quieres ver qué archivo se modificó más recientemente, ls -ltr te muestra el más nuevo al final, que es exactamente donde termina tu vista de terminal.
Lo que se rompe si lo usas mal: procesar la salida de ls en un script es un error clásico. Los nombres de archivo pueden contener espacios, saltos de línea, o caracteres especiales que parten el parsing. Para eso existen find con -print0 o el globbing del shell (for f in /ruta/*). ls es para ojos humanos, no para awk.
La salida de ls -lah línea por línea
# Creamos un directorio de prueba con varios tipos de archivos mkdir -p ~/prueba_ls cd ~/prueba_ls # Un archivo normal, uno oculto, un ejecutable y un subdirectorio echo "configuración de ejemplo" > config.txt echo "clave=secreta123" > .env mkdir logs install -m 755 /bin/ls ./mi_herramienta # copia con permisos de ejecución truncate -s 2M archivo_grande.dat # archivo de 2 MB exactos # Vista completa: largo + ocultos + tamaños legibles ls -lah # Ordenar por tiempo de modificación, más nuevo al final (útil en logs) ls -ltr # Ordenar por tamaño, mayor primero ls -lS
La salida de ls -lah tiene este aspecto:
total 2,1M drwxr-xr-x 3 ana ana 4,0K 3 jun 11:42 . drwxr-xr-x 8 ana ana 4,0K 3 jun 11:42 .. -rw-r--r-- 1 ana ana 13 3 jun 11:42 .env -rwxr-xr-x 1 root root 143K 3 jun 11:42 mi_herramienta -rw-r--r-- 1 ana ana 2,0M 3 jun 11:42 archivo_grande.dat -rw-r--r-- 1 ana ana 25 3 jun 11:42 config.txt drwxr-xr-x 2 ana ana 4,0K 3 jun 11:42 logs
Qué significa cada columna
La primera columna (-rw-r--r--, drwxr-xr-x) son los permisos. El primer carácter indica el tipo: - es un archivo regular, d es directorio, l sería un enlace simbólico. Los nueve siguientes son tres grupos de rwx (lectura, escritura, ejecución) para propietario, grupo, y el resto del mundo. Fíjate en mi_herramienta: tiene x en los tres grupos porque lo copiamos con permisos de ejecución.
El número que sigue (1, 2, 3) es el número de hard links al inodo. Para directorios empieza en 2 porque . y el propio nombre cuentan como dos referencias; cada subdirectorio que creas añade uno más. Para archivos normales casi siempre verás 1.
Las columnas de propietario y grupo (ana ana, root root) te dicen quién posee el archivo. mi_herramienta muestra root root porque lo copiamos con install desde un binario del sistema — el propietario original se preservó. Eso en producción es una señal de alerta si no lo esperas.
El tamaño con -h aparece como 2,0M, 143K, 4,0K. Sin -h verías 2097152, 146776, 4096 — legible para awk, inútil para un humano a las 3 de la mañana. El total 2,1M al principio es el espacio en bloques que ocupa el directorio completo, no la suma de tamaños individuales.
La fecha es la última modificación del contenido (mtime). No confundas esto con la fecha de creación, que en Linux no existe en la mayoría de sistemas de archivos, o con ctime, que es el último cambio de metadatos. Cuando ves que un archivo de configuración tiene fecha de hace tres años pero el directorio que lo contiene tiene fecha de ayer, algo escribió en ese directorio recientemente aunque no tocara ese archivo concreto.
ls -ltr invierte el orden temporal y pone el más reciente al final. En un directorio /var/log con decenas de archivos, esto significa que cuando haces scroll hasta abajo ves exactamente cuál fue el último fichero en cambiar, sin tener que buscar. La combinación -t (ordenar por tiempo) más -r (invertir) más -l (formato largo) es el trío que más vas a escribir cuando depuras algo en caliente.
Finalmente, .env aparece solo porque usamos -a. Sin esa flag, ls oculta cualquier archivo cuyo nombre empiece por punto. Eso incluye . y .. (el directorio actual y el padre), que también aparecen con -a. Si solo quieres los ocultos pero no . y .., usa -A en mayúscula.
N° 18