touch tiene dos usos principales: crear un archivo vacío si no existe, o actualizar las marcas de tiempo (atime, mtime, ctime) de un archivo ya existente sin modificar su contenido.
| Opción | Descripción |
|---|---|
| -a | Solo cambia la hora de acceso (access time). |
| -m | Solo cambia la hora de modificación (modification time). |
| -t [[CC]YY]MMDDhhmm[.ss] | Usa la fecha/hora especificada en lugar de la hora actual. |
# Crear un archivo vacío touch /home/jose/ejemplo.txt # Crear varios archivos a la vez touch /home/jose/archivo1.txt /home/jose/archivo2.txt # Verificar el archivo recién creado ls -l informe_ventas.doc -rw-rw-r-- 1 jose jose 0 Oct 9 07:00 informe_ventas.doc # Tamaño = 0 → archivo vacío # Establecer fecha y hora específica touch -t 202510091200.00 /home/jose/ejemplo.txt # Actualizar solo la hora de acceso (-a) touch -a datos_antiguos.txt
Demostración: efecto de touch -a con stat
touch datos_antiguos.txt # (Esperar 10 segundos...) stat datos_antiguos.txt | grep "Acceso\|Modificación" Acceso: 2025-10-11 08:59:24.256741984 +0200 Modificación: 2025-10-11 08:58:39.417333542 +0200 touch -a datos_antiguos.txt stat datos_antiguos.txt | grep "Acceso\|Modificación" Access: 2025-10-09 07:01:10.000000000 +0200 ← ¡Esta se actualizó! Modify: 2025-10-09 07:01:00.000000000 +0200 ← Esta no cambia
file examina los bytes del archivo, no su extensión, para determinar su tipo real. Es fundamental para identificar archivos con extensiones incorrectas o sin extensión.
| Opción | Descripción |
|---|---|
| -s | Trabaja con archivos especiales de bloque o carácter (útil para ver el tipo de sistema de archivos en una partición). |
touch archivo_vacio.txt echo "Hola, esto es un script" > mi_script.sh file archivo_vacio.txt archivo_vacio.txt: empty file mi_script.sh mi_script.sh: ASCII text file /bin/bash /bin/bash: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, ... file /home/jose/ejemplo.txt # texto plano file /bin/ls # ejecutable ELF file /home/jose/archivo.zip # Zip archive data
stat muestra información exhaustiva sobre un archivo o sistema de archivos: tamaño, inodo, permisos, propietario y las cuatro marcas de tiempo.
| Opción | Descripción |
|---|---|
| -f | Muestra el estado del sistema de archivos donde reside el archivo. |
| -c "%n %a %U %G" | Formato personalizado: nombre, permisos en octal, usuario y grupo. |
Las cuatro marcas de tiempo
touch informe_semanal.pdf stat informe_semanal.pdf File: informe_semanal.pdf Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 801h/2049d Inode: 2000001 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ jose) Gid: ( 1000/ jose) Access: 2025-10-09 07:05:00.000000000 +0200 Modify: 2025-10-09 07:05:00.000000000 +0200 Change: 2025-10-09 07:05:00.000000000 +0200 Birth: 2025-10-09 07:05:00.000000000 +0200
/etc/passwd, /etc/sudoers o ~/.ssh/id_rsa revela si un atacante accedió a información sensible.stat -c "%n %a %U %G" /usr/bin/comando verifica rápidamente si un binario tiene permisos laxos o bits SUID/SGID explotables.stat ~/.ssh/id_rsa — si existe, el atacante puede usarla para movimiento lateral hacia otros servidores sin contraseña.# Verificar cuándo se modificó /etc/passwd stat /etc/passwd # Revisar acceso a clave privada SSH stat ~/.ssh/id_rsa # Formato personalizado: nombre, permisos, usuario, grupo stat -c "%n %a %U %G" /usr/bin/comando_sospechoso
find busca en una jerarquía de directorios archivos que cumplan condiciones combinables. Siempre preciso — ve los archivos en el momento exacto de ejecución.
find ruta [opciones] [condiciones]
| Opción | Descripción |
|---|---|
| -name "patron" | Busca por nombre (distingue mayúsculas/minúsculas). |
| -iname "patron" | Busca por nombre ignorando mayúsculas/minúsculas. |
| -type f | Solo archivos regulares. Usa d para directorios, l para enlaces simbólicos. |
| -user nombre | Archivos propiedad del usuario especificado. |
| -not -user nombre | Archivos no propiedad del usuario. |
| -mtime +N / -N | Modificados hace más de N días (+N) o menos de N días (-N). |
| -size +10M | Archivos mayores a 10 MB. Usa k, M, G. |
| -exec cmd {} \; | Ejecuta un comando sobre cada resultado encontrado. |
# Buscar por nombre en /etc find /etc -name "interfaces" /etc/cups/interfaces # Todos los .txt en carpeta personal find /home/jose -type f -name "*.txt" # Archivos modificados en las últimas 24 horas find /home/jose -type f -mtime -1 # Archivos mayores a 10 MB find /home/jose -type f -size +10M # Buscar y listar detalles con -exec find /home/jose -type f -name "*.log" -exec ls -lh {} \; # Buscar en /etc archivos NO de jose modificados hoy sudo touch /etc/mi_nuevo_config.conf find /etc/mi_nuevo_config.conf -type f -not -user jose -mtime -1 # Buscar todos los directorios sudo find -type d # Buscar todos los archivos de jose sudo find -user jose
sudo apt install plocate| Opción | Descripción |
|---|---|
| -i | Ignora mayúsculas/minúsculas. |
| -c | Solo cuenta el número de resultados. |
# Buscar archivos con "bashrc" en el nombre locate bashrc | head -3 /etc/bash.bashrc /etc/skel/.bashrc /home/jose/.bashrc # Buscar todos los .pdf locate "*.pdf" # Contar archivos con "mysql" (ignorando mayúsculas) locate -i -c mysql 152 # Si el archivo no aparece → actualizar la base de datos sudo updatedb locate app.py /home/jose/proyectos/python/app.py ← ¡Ahora sí aparece!
locate no lo encontrará hasta que se ejecute sudo updatedb para actualizar la base de datos.find vs locate — ¿cuál usar?
sudo updatedb.which busca binarios ejecutables en los directorios listados en la variable $PATH y devuelve la ruta completa al primer resultado.
| Opción | Descripción |
|---|---|
| -a | Imprime todas las coincidencias en el $PATH, no solo la primera. |
which ls /usr/bin/ls which python3 /usr/bin/python3 which man which nano which df # Disk Free — uso de espacio en disco which passwd # Binario de cambio de contraseña # Herramientas disponibles para pentesting which gcc # ¿Hay compilador? which perl # ¿Scripting avanzado? which nc # ¿Netcat disponible? which python # Para reverse shell
which permite obtener la ruta exacta (ej. /bin/bash) para garantizar la ejecución de scripts y exploits.ls, netcat u otros con versiones modificadas para registrar actividad. which muestra qué binario se está ejecutando realmente.gcc), intérpretes (perl, ruby), herramientas de red (nc, ncat).type indica si un comando es un alias, una función, un builtin del shell o un ejecutable externo en disco.
| Opción | Descripción |
|---|---|
| -a | Muestra todas las formas en las que podría interpretarse el nombre. |
Los cuatro tipos posibles
type ls # alias type cd # builtin type find # ejecutable externo type python3 # ruta del intérprete
basename elimina el prefijo de directorio de una ruta, dejando solo el nombre del archivo o directorio final. Opcionalmente puede quitar también la extensión.
basename /home/jose/documentos/completo.txt completo.txt basename /etc/apt/ apt # Eliminar extensión (especificar el sufijo) basename /home/jose/completo.txt txt completo basename /home/jose/script.sh .sh script
dirname complementa a basename: elimina el último componente de la ruta, dejando solo la parte del directorio.
dirname /home/jose/completo.txt /home/jose/ dirname completo.txt . # El punto (.) representa el directorio actual dirname /usr/local/bin/ /usr/local dirname /home/jose/documentos/ejemplo.txt /home/jose/documentos
dirname y basename se usan frecuentemente en scripts para separar la parte del directorio del nombre del archivo, por ejemplo: DIR=$(dirname "$0") obtiene el directorio donde está el script que se está ejecutando.# 1. Crear el archivo mkdir -p /home/jose/proyectos/python touch /home/jose/proyectos/python/app.py # 2. Descomponer la ruta basename /home/jose/proyectos/python/app.py app.py dirname /home/jose/proyectos/python/app.py /home/jose/proyectos/python # 3. Identificar tipo de archivo file /home/jose/proyectos/python/app.py /home/jose/proyectos/python/app.py: empty # 4. Ver metadatos completos stat /home/jose/proyectos/python/app.py # Muestra tamaño, inodo, fecha, permisos... # 5. Buscar en tiempo real (siempre preciso) find /home/jose/proyectos -name "*.py" /home/jose/proyectos/python/app.py # 6. Buscar en base de datos (puede no aparecer aún) locate app.py # Si no aparece, actualizar la BD: sudo updatedb locate app.py /home/jose/proyectos/python/app.py ← ¡Ahora aparece! # 7. Localizar el intérprete de Python which python3 /usr/bin/python3 # 8. Ver tipo de comandos relacionados type cd cd is a shell builtin type python3 python3 is /usr/bin/python3
touch crea/actualiza timestamps · file identifica tipo real · stat muestra todos los metadatos · find busca en tiempo real con condiciones · locate busca rápido en BD · which ruta del ejecutable · type tipo de comando · basename nombre del fichero · dirname ruta del directorio