Si vienes de otros sistemas como Windows, es muy fácil que la gestión de archivos en Linux desde la terminal te parezca un mundo. Sin embargo, cuando entiendes cómo funcionan los atributos de archivos, permisos, ACLs y otros metadatos, la consola pasa de ser algo intimidante a convertirse en una navaja suiza con la que puedes hacer prácticamente cualquier cosa.
En este artículo vamos a ver, de forma detallada y paso a paso, cómo ver, interpretar y modificar los atributos de archivos en Linux, tanto los clásicos (permisos, fechas, propietario) como los avanzados (atributos extendidos, listas de control de acceso, flags especiales del sistema de archivos). Todo ello usando la terminal y comandos como ls, stat, chattr, lsattr, setfacl, getfacl y attr.
Conceptos básicos del sistema de archivos en Linux
Antes de ponernos a toquetear atributos, conviene tener clara una idea clave: en Linux prácticamente todo se trata como un archivo. No solo los documentos de texto o las imágenes, sino también los directorios, dispositivos, tuberías, sockets, enlaces simbólicos… Esta filosofía permite que el sistema use las mismas herramientas para manejar elementos muy diferentes entre sí.
Tipos de archivos y cómo identificarlos
Cuando ejecutas ls -l en un directorio, cada línea de salida comienza con una cadena de diez caracteres, algo del estilo drwxrwxr-x o -rw-rw-r--. El primer carácter indica el tipo de archivo, mientras que los otros nueve representan los permisos de usuario, grupo y otros.
- – Archivo regular (lo típico: texto, binarios, imágenes, etc.)
- d Directorio
- b Dispositivo de bloque (discos, por ejemplo, en
/dev) - c Dispositivo de carácter (terminales, puertos serie, etc.)
- l Enlace simbólico
- p Fichero de tipo tubería o FIFO
- s Socket
- n Archivo de red (dependiendo del sistema y herramientas utilizadas)
Así, si ves algo como drwxrwxr-x 2 lorenzo lorenzo 4096 feb 11 08:33 documentos, la d inicial indica que es un directorio, seguida de sus permisos, número de enlaces duros, propietario, grupo, tamaño, fecha y nombre.
Linux distingue entre mayúsculas y minúsculas
Un detalle que suele despistar al principio es que el sistema de archivos de Linux diferencia claramente entre mayúsculas y minúsculas. No es lo mismo archivo que Archivo o ArChivo, son nombres completamente distintos. Si escribes mal una mayúscula en un comando, el sistema te dirá que el archivo o directorio no existe, aunque a ti te parezca idéntico.
Las extensiones no mandan
En Linux la extensión de un archivo no define su tipo ni su comportamiento. Un fichero llamado programa.exe no tiene por qué ser ejecutable; lo que determina si se puede ejecutar o no son los permisos y, en algunos casos, el contenido (cabeceras, shebang, etc.). Las extensiones se usan por pura comodidad humana, no porque el sistema las necesite para saber qué hacer.
Espacios y caracteres especiales en nombres
Los espacios en los nombres de archivo son perfectamente válidos, pero al trabajar en la terminal hay que tratarlos con cuidado, porque el intérprete de comandos separa los parámetros por espacios. Por ejemplo, si escribes:
mkdir mis documentos
en realidad estás creando dos directorios, uno llamado mis y otro llamado documentos. Para que el nombre completo se trate como una sola unidad, tienes dos opciones muy habituales:
- Usar comillas:
mkdir 'mis documentos' - Escapar el espacio con una barra invertida:
mkdir mis\ documentos
Ese carácter de escape (\) también se utiliza para otros símbolos especiales. Algunos de los más comunes son \’ (comilla simple), \» (comilla doble), \\ (barra invertida), \n (salto de línea), \t (tabulador) o \r (retorno de carro).
Archivos y directorios ocultos
En Linux, un archivo se considera oculto de una forma muy sencilla: si su nombre comienza por un punto, no aparece en el listado normal de ls. Para verlos tienes que usar:
ls -a
Si tienes un archivo llamado miarchivo.txt, será visible; en cambio, .miarchivo.txt estará oculto a menos que uses la opción -a. Existe otra posibilidad menos conocida: crear un fichero llamado .hidden y, dentro, listar los nombres de archivos que quieras ocultar en algunos gestores de archivos gráficos. En la terminal, de todos modos, el criterio principal de ocultación sigue siendo el punto inicial.
Comandos básicos de gestión de archivos
Para llegar a manipular atributos, primero necesitas manejarte con soltura gestionando archivos y directorios en lo básico: crear, borrar, mover, copiar y listar.
Navegar por el sistema de archivos
Para cambiar de directorio se utiliza el comando cd:
cd /ruta/al/directorio
Si escribes simplemente cd sin argumentos, la shell te lleva a tu directorio personal (por ejemplo, /home/tuusuario). Para saber dónde estás en cada momento recurrimos a:
pwd
que muestra la ruta completa del directorio de trabajo actual. Para listar su contenido, usamos ls, que admite un buen surtido de opciones para ajustar la información mostrada.
Listar archivos con ls
El comando ls sirve para ver el contenido de un directorio, y con sus distintos modificadores podemos obtener información bastante detallada sobre cada archivo. Algunos de los más útiles son:
- -a: incluye los archivos ocultos (los que empiezan por punto)
- -l: formato largo, con permisos, propietario, tamaño, fechas, etc.
- -R: listado recursivo de subdirectorios
- -t: ordena por fecha de modificación
- -r: invierte el orden del listado
- -i: muestra el número de inodo
- -s: enseña el tamaño (en bloques) junto al nombre
Si combinas, por ejemplo, ls -la, obtienes un resumen muy completo con prácticamente todos los campos que necesitamos para empezar a hablar de atributos de archivo clásicos.
Crear y eliminar directorios
Para crear directorios utilizamos mkdir. Un uso típico sería:
mkdir midirectorio
Si estás en /home/lorenzo, todas las siguientes órdenes crean el mismo directorio ejemplo en esa ruta:
mkdir ejemplo
mkdir /home/lorenzo/ejemplo
mkdir ~/ejemplo
mkdir ./ejemplo
mkdir ../lorenzo/ejemplo
La virgulilla ~ representa tu directorio de inicio, . alude al directorio actual y .. hace referencia al directorio padre. Si quieres crear varios niveles de una sola vez (por ejemplo /home/lorenzo/este/es/otro/ejemplo cuando parte de esa estructura no existe), debes añadir la opción -p:
mkdir -p /home/lorenzo/este/es/otro/ejemplo
Para borrar directorios vacíos está rmdir, y para eliminar directorios con contenido empleamos rm -r, ya que rmdir solo funciona si el directorio está completamente vacío.
Eliminar archivos y directorios con rm
El comando rm se encarga de eliminar archivos. Para borrar un archivo concreto bastaría con:
rm archivo.txt
Si lo que queremos es borrar un directorio y todo lo que cuelga de él, usamos la opción -r (recursivo). Si no quieres que el sistema te pregunte nada, puedes añadir -f (forzar):
rm -rf directorio
Este comando es extremadamente potente y peligroso: un rm -rf / ejecutado como administrador puede arrasar todo el sistema de archivos. De ahí que sea fundamental entender bien lo que se está borrando antes de apretar Enter.
Copiar con cp y mover con mv
Para duplicar archivos y directorios tenemos cp. Su sintaxis básica admite tanto la copia archivo-archivo como archivo-directorio:
cp archivo_origen archivo_destino
cp archivo_origen directorio_destino/
Si lo que copias es un directorio, necesitas la opción -R (o -r) para que sea recursivo. Además, cp incluye opciones específicas para preservar atributos, algo clave cuando se trata de permisos, tiempos y atributos extendidos:
- -p: conserva propietario, grupo, permisos y fechas
- -a: modo archivo, intenta mantener todos los atributos posibles
- –preserve=mode,ownership,timestamps,xattr: preserva permisos, propiedad, marcas de tiempo y atributos extendidos
Para mover o renombrar ficheros y directorios se emplea mv. La idea es simple: especificas la ubicación o nombre actual y el nuevo destino o nuevo nombre:
mv /home/lorenzo/archivo.txt /home/lorenzo/directorio/archivo.txt
mv archivo_viejo.txt archivo_nuevo.txt
Al mover dentro del mismo sistema de archivos, mv conserva por defecto todos los atributos, salvo que el destino sea un sistema de archivos limitado (por ejemplo, atributos extendidos en un pendrive con un sistema de archivos limitado).
Al mover dentro del mismo sistema de archivos, mv conserva por defecto todos los atributos, salvo que el destino sea un sistema que no soporte algunos de ellos (por ejemplo, atributos extendidos en un pendrive con un sistema de archivos limitado).
Permisos clásicos: chmod y representación octal
El modelo tradicional de permisos en Linux se basa en tres grupos de bits: usuario propietario, grupo propietario y otros. Cada uno puede tener permiso de lectura (r), escritura (w) y ejecución (x). Para modificar este conjunto usamos el comando chmod.
Modificar permisos con notación simbólica
La forma simbólica de chmod indica a quién se aplican los cambios, qué operación realizamos y qué permisos añadimos o quitamos. La estructura es:
chmod archivo
- Quién:
u(usuario),g(grupo),o(otros),a(todos) - Operación:
+(añadir),-(quitar),=(asignar exactamente) - Permiso:
r(lectura),w(escritura),x(ejecución),s(setuid/setgid en contextos concretos)
Por ejemplo, si queremos que el usuario pueda leer y ejecutar un archivo llamado manual_linux, haríamos:
chmod u+rx manual_linux
Si deseamos que cualquiera pueda leer un archivo, podríamos usar:
chmod a+r nombre_archivo
o, de forma más explícita, manipulando usuario, grupo y otros por separado:
chmod u=r,g=r,o=r nombre_archivo
Modificar permisos con notación octal
La otra forma habitual de usar chmod es mediante valores octales. Cada grupo de permisos (usuario, grupo, otros) se representa con un número de 0 a 7 en función de la suma de los bits activados:
- r (lectura) vale 4
- w (escritura) vale 2
- x (ejecución) vale 1
Así, un usuario con lectura, escritura y ejecución tendrá 7 (4+2+1), un grupo con solo lectura y ejecución tendrá 5 (4+1), y otros con únicamente ejecución tendrán 1. Si queremos, por ejemplo, que el usuario tenga todos los permisos, el grupo lectura y ejecución, y el resto solo ejecución en un archivo llamado permisos.txt, usaríamos:
chmod 751 permisos.txt
Al ejecutar ls -l veremos algo como -rwxr-x--x, que se corresponde con esos valores. Este sistema octal es muy cómodo cuando ya estás familiarizado con la relación entre números y bits de permiso.
Ver atributos y metadatos con stat

Aunque ls -l da mucha información, hay ocasiones en las que queremos ir más lejos y consultar fechas exactas o atributos concretos. Ahí entra en juego el comando stat, que muestra detalles exhaustivos sobre un archivo o sistema de archivos.
Uso básico de stat
Si ejecutas:
stat archivo.txt
obtendrás un resumen con varios campos: tamaño, número de bloques, número de inodo, permisos, propietario, grupo, y tres marcas de tiempo fundamentales:
- Access (atime): última fecha y hora de acceso (lectura)
- Modify (mtime): última modificación de contenido
- Change (ctime): último cambio en metadatos (permisos, propietario, etc.)
Además, stat permite personalizar la salida con el modificador -c seguido de un formato. Algunos especificadores muy prácticos son:
- %x: fecha de último acceso
- %y: fecha de última modificación
- %a: permisos en notación octal
Por ejemplo, para ver solo la fecha de último acceso de prueba.txt:
stat -c %x prueba.txt
Si lo que te interesa es cuándo se modificó por última vez su contenido, usarías:
stat -c %y prueba.txt
Y para obtener sus permisos en octal de forma directa:
stat -c %a prueba.txt
Si lees el archivo con cat y luego consultas de nuevo el atime, verás que la fecha de acceso ha cambiado. De la misma forma, si añades contenido con echo y redirección, el mtime también se actualizará.
Consultar el sistema de archivos con stat -f
Cuando te interesa el sistema de archivos en su conjunto, no un archivo concreto, puedes emplear stat con la opción -f. En ese caso, la herramienta muestra datos globales del sistema de archivos: tipo, tamaño máximo de archivo, número de bloques libres, etc. Esto es especialmente útil para tareas de administración a mayor escala.
Atributos extendidos del sistema de archivos
Más allá de los permisos clásicos, algunos sistemas de archivos (como ext2, ext3 y ext4) permiten establecer atributos extendidos a nivel de sistema que alteran el comportamiento de los ficheros. No son permisos en sí mismos, pero pueden limitar operaciones como borrar, modificar o registrar tiempos de acceso. Para trabajar con ellos usamos principalmente chattr y lsattr.
Consultar atributos de sistema con lsattr
El comando lsattr muestra los atributos extendidos asociados a archivos y directorios. Su salida típica es una serie de letras o guiones que indican qué flags están activos. Por ejemplo:
lsattr archivo.txt
puede devolver algo como:
----i---------e------- archivo.txt
Si quieres una descripción más legible, puedes añadir la opción -l:
lsattr -l archivo.txt
y verás etiquetas como Immutable o Append_Only junto al nombre del archivo, lo que facilita entender qué comportamiento especial tiene.
Atributos de sistema más comunes
Entre los diversos atributos extendidos de sistema, hay algunos que se utilizan con mucha más frecuencia por su impacto directo en la seguridad y el rendimiento:
- a: modo solo append. El archivo solo puede abrirse para añadir datos al final; no se puede truncar ni modificar su contenido existente.
- A: desactiva la actualización del tiempo de acceso (no atime), de modo que leer el archivo no cambia su marca de acceso, lo cual puede mejorar el rendimiento en determinadas cargas.
- d: el archivo se excluye de copias de seguridad realizadas con herramientas como
dump(no dump). - D: sincroniza el contenido del directorio con disco en cada escritura.
- i: atributo inmutable. El archivo no se puede borrar, renombrar ni modificar mientras esta marca esté activa, ni siquiera por root, salvo que este quite la flag primero.
- S: fuerza la sincronización a disco de las escrituras en ese archivo.
- e: indica que el archivo utiliza extents para mapear los bloques en disco. Es típica en ext4 y no se puede modificar con chattr.
Estos atributos los puede cambiar únicamente el administrador del sistema, precisamente porque afectan al comportamiento interno del sistema de archivos y pueden utilizarse como mecanismo de protección.
Modificar atributos de sistema con chattr
Para añadir o eliminar atributos extendidos de sistema se usa el comando chattr. Su sintaxis general es:
chattr archivo...
Los operadores funcionan de forma similar a los de chmod:
- +: añade el atributo o atributos especificados a los existentes
- –: elimina los atributos indicados de los ya activos
- =: establece exactamente los atributos dados, sustituyendo a cualquier otro
Por ejemplo, para marcar un archivo como inmutable:
sudo chattr +i prueba.txt
mientras que para quitar esa inmutabilidad harías:
sudo chattr -i prueba.txt
Como ves, solo el usuario root puede establecer o retirar ciertas flags sensibles como la inmutabilidad. Otros atributos, según el sistema de archivos, podrían tener restricciones adicionales.
Atributos extendidos de usuario (xattr)
Además de los atributos de sistema, existe otro nivel de metadatos llamados atributos extendidos de usuario (xattr), que no afectan a los permisos ni a la capacidad de modificar o borrar un archivo. Se utilizan para almacenar pares clave-valor adicionales: por ejemplo, datos sobre el autor, metainformación de aplicaciones, etiquetas, etc.
Requisitos para usar atributos de usuario
Para trabajar con estos atributos es necesario que el sistema de archivos se haya montado con la opción user_xattr y tener instalado el paquete attr, que proporciona los comandos necesarios. Una vez cumplidas estas condiciones, podemos gestionar xattr con la herramienta attr.
Gestionar atributos de usuario con attr
El comando attr admite varias opciones para listar, añadir, mostrar o eliminar atributos:
- -ql: lista todos los atributos de un archivo
- -qs: añade o modifica un atributo
- -qg: muestra el valor de un atributo concreto
- -qr: borra un atributo
Si quieres, por ejemplo, añadir un atributo llamado autor al archivo fichero1.txt con el valor Etaboada, podrías hacer:
attr -qs autor -V "Etaboada" fichero1.txt
Después, para ver qué atributos tiene ese archivo, bastaría con:
attr -ql fichero1.txt
Estos atributos son muy útiles para aplicaciones o scripts que necesiten guardar información extra asociada a los archivos sin mezclarla con su contenido.
Conservar atributos extendidos al copiar o sincronizar
Un detalle importante es que no todas las operaciones sobre archivos preservan automáticamente los atributos extendidos. Si los necesitas, hay que añadir opciones específicas a las herramientas que uses:
| cp | –preserve=mode,ownership,timestamps,xattr |
| mv | Conserva los atributos por defecto, salvo que el sistema de destino no los soporte |
| tar | –xattrs (tanto al crear como al extraer el archivo tar) |
| bsdtar | -p (en la extracción) para preservar los atributos |
| rsync | –xattrs para sincronizar atributos extendidos junto con los datos |
Si omites estas opciones, es muy probable que pierdas los xattr durante copias, backups o sincronizaciones, lo que puede dar lugar a comportamientos inesperados en aplicaciones que dependan de ellos.
Listas de control de acceso (ACL) para permisos granulares
El modelo tradicional de permisos (usuario, grupo y otros) funciona bien en muchos casos, pero se queda corto cuando necesitas algo más preciso, como dar permisos específicos a varios usuarios o grupos concretos. Para eso existen las ACL (Access Control Lists), que amplían el sistema de permisos ofreciendo un control mucho más granular.
Cuándo usar ACL en lugar de solo chmod
Imagina que tienes un directorio compartido y quieres que solo tres usuarios concretos puedan escribir en él, mientras el resto solo pueda leer. Con el modelo clásico tendrías que jugar con el grupo propietario y los permisos de otros, lo cual se puede volver un lío o directamente no encajar con la política de seguridad que buscas. Las ACL permiten definir, por ejemplo, que el usuario user1 tenga rwx, user2 tenga rx y el resto solo r, todo ello sin tocar en exceso la estructura de grupos del sistema.
Instalar herramientas ACL
En muchas distribuciones, los comandos para gestionar ACL no vienen instalados por defecto. Si no los tienes, normalmente bastará con instalar el paquete acl. En sistemas basados en Debian o Ubuntu, por ejemplo, podrías hacer:
sudo apt install acl
Esto te proporcionará los comandos setfacl y getfacl, imprescindibles para trabajar con listas de control de acceso.
Asignar ACL con setfacl
El comando setfacl se utiliza para añadir o modificar entradas ACL en archivos y directorios. Su forma básica es:
setfacl {ACCIÓN}{ESPECIFICACIÓN_ACL} archivo_o_directorio
Las acciones más utilizadas son:
- -m: modifica (o añade) una entrada ACL
- -x: elimina una entrada ACL existente
La especificación ACL tiene la forma:
- u:nombreusuario:permisos para usuarios
- g:nombregrupo:permisos para grupos
Por ejemplo, supongamos que existe un directorio /home/shared propiedad de root, al que el resto de usuarios solo puede acceder en lectura. Si quieres que user1 pueda leer, escribir y entrar en ese directorio, puedes hacer:
sudo setfacl -m u:user1:rwx /home/shared
Es importante tener en cuenta que, aunque el permiso de otros fuera solo lectura, la ACL para user1 le dará permisos adicionales que tienen prioridad sobre la máscara general, siempre que la máscara lo permita.
Ver ACL con getfacl
Para inspeccionar las ACL de un archivo o directorio se utiliza getfacl. Un ejemplo típico sería:
getfacl /home/shared
que puede mostrar algo como:
# file: shared
# owner: root
# group: root
user::rwx
user:user1:rwx
group::r-x
mask::rwx
other::r-x
Aquí se aprecia que, además de la entrada básica del propietario (user::rwx), aparece una entrada específica para user1, la de grupo y la máscara (mask::), que limita el conjunto máximo de permisos efectivos para usuarios y grupos distintos del propietario.
Eliminar ACL con setfacl -x
Para quitar una entrada ACL en concreto, seguimos usando setfacl, pero con la opción -x. La especificación es similar a la utilizada para crearla, solo que sin los permisos. Si la salida de getfacl muestra:
user:user1:rwx
la especificación relevante sería u:user1. Para eliminarla usaríamos:
setfacl -x u:user1 /home/shared
Tras eso, una nueva llamada a getfacl confirmará que la entrada ACL para ese usuario ha desaparecido, y sus permisos volverán a estar regidos únicamente por el modelo clásico (usuario/grupo/otros).
Herramientas de consulta y búsqueda relacionadas
Para completar el panorama, conviene recordar algunas utilidades muy usadas a la hora de trabajar con archivos desde la terminal, que no modifican atributos directamente pero sí se apoyan en ellos o nos ayudan a localizar información de forma eficiente.
Buscar archivos con find y filtrar por atributos
El comando find permite buscar archivos según criterios muy variados: nombre, tamaño, fecha de creación o modificación, propietario, grupo, permisos, etc. Su sintaxis mínima es:
find ruta
Algunas opciones interesantes para trabajar con atributos y metadatos son:
- -name «patrón»: localiza archivos cuyo nombre coincide con el patrón indicado
- -user usuario: busca archivos pertenecientes a un usuario concreto
- -group grupo: busca archivos cuyo grupo propietario coincide con el especificado
- -perm modo: filtra por permisos, pudiendo usar notación simbólica u octal
- -size +nK: localiza ficheros de tamaño superior a n kilobytes
- -ctime n: archivos creados o cambiados hace n días
- -maxdepth n: limita el nivel de profundidad de búsqueda a n directorios
- -follow: sigue enlaces simbólicos
Además, puedes combinar find con acciones como -print para mostrar resultados o -exec para ejecutar un comando sobre cada archivo encontrado. Por ejemplo, para localizar y borrar todos los archivos con extensión .bak bajo /usr/doc harías:
find /usr/doc -name "*.bak" -exec rm -f {} \;
La secuencia {} se sustituye por el nombre del archivo, y \; indica el final del comando a ejecutar.
Examinar contenido con cat y buscar texto con grep
Para ver rápidamente el contenido de un archivo de texto, el recurso clásico es cat, que vuelca el contenido a la salida estándar. Con opciones como -n (numerar todas las líneas) o -b (numerar solo líneas no vacías) se puede facilitar la lectura en determinados casos.
Por su parte, grep es la herramienta reina para buscar patrones de texto dentro de archivos. Acepta expresiones regulares y dispone de multitud de modificadores, por ejemplo:
- -i: ignora mayúsculas y minúsculas
- -c: muestra cuántas líneas coinciden con el patrón
- -l: lista solo los nombres de archivos que contienen el patrón
- -v: muestra las líneas que no coinciden
Combinando find, grep y las herramientas vistas anteriormente, puedes construir tuberías muy potentes para auditar permisos, localizar ficheros con determinados atributos o simplemente encontrar lo que necesitas en un árbol de directorios grande.
Con todo este repertorio —desde los permisos tradicionales gestionados con chmod hasta los atributos extendidos con chattr y attr, pasando por las ACL con setfacl y getfacl y las consultas detalladas de stat— ya tienes una visión bastante completa de cómo manejar los atributos de archivos en Linux desde la terminal, de forma segura y precisa, ajustando el comportamiento y el acceso a tus ficheros mucho más allá de lo que permiten las opciones básicas.