Búsqueda de sitios web

Crea un archivo temporal en Linux con Bash


El comando mktemp en sistemas basados en Fedora y tempfile en sistemas basados en Debian están especialmente diseñados para aliviar esa carga al facilitar la creación, el uso y la eliminación de archivos únicos.

Al programar en el lenguaje de scripting Bash, a veces es necesario crear un archivo temporal. Por ejemplo, es posible que necesite tener un archivo intermediario que pueda enviar al disco para poder procesarlo con otro comando. Es fácil crear un archivo como temp o cualquier archivo que termine en .tmp. Sin embargo, es muy probable que esos nombres sean generados por algún otro proceso, por lo que podría sobrescribir accidentalmente un archivo temporal existente. Y además de eso, no deberías tener que esforzarte mentalmente para encontrar nombres que parezcan únicos. El comando mktemp en sistemas basados en Fedora y tempfile en sistemas basados en Debian están especialmente diseñados para aliviar esa carga al facilitar la creación, el uso y la eliminación de archivos únicos.

Crear un archivo temporal

Tanto mktemp como tempfile crean un archivo temporal como acción predeterminada e imprimen el nombre y la ubicación del archivo como salida:

$ tempfile
/tmp/fileR5dt6r

$ mktemp 
/tmp/tmp.ojEfvMaJEp

A menos que especifique una ruta diferente, el sistema coloca archivos temporales en el directorio /tmp. Para mktemp, utilice la opción -p para especificar una ruta:

$ mktemp -p ~/Demo
/home/tux/Demo/tmp.i8NuhzbEJN

Para tempfile, utilice la opción --directory o -d:

$ tempfile --directory ~/Demo/
/home/sek/Demo/fileIhg9aX

Encuentra tu archivo temporal

El problema con el uso de un archivo temporal generado automáticamente es que no hay forma de saber cuál será su nombre. Es por eso que ambos comandos devuelven el nombre del archivo generado como salida. Puede utilizar un shell interactivo como Konsole, GNOME Terminal o rxvt para utilizar el nombre de archivo que se muestra en su terminal para interactuar con el archivo.

Sin embargo, si está escribiendo un script, no hay forma de intervenir leyendo el nombre del archivo y usándolo en los siguientes comandos.

Los autores de mktemp y tempfile pensaron en ese problema y hay una solución fácil. El terminal envía la salida a una secuencia llamada stdout. Puedes capturar la salida estándar configurando una variable para los resultados de un comando lanzado en un subshell:

$ TMPFILE=$(mktemp -p ~/Demo)

$ echo $TMPFILE
/home/tux/Demo/tmp.PjP3g6lCq1

Utilice $TMPFILE cuando haga referencia al archivo, y es lo mismo que interactuar directamente con el archivo mismo.

Crea un directorio temporal con mktemp

También puedes usar el comando mktemp para crear un directorio en lugar de un archivo:

$ mktemp --directory -p ~/Demo/
/home/tux/Demo/tmp.68ukbuluqI

$ file /home/tux/Demo/tmp.68ukbuluqI
/home/tux/Demo/tmp.68ukbuluqI: directory

Personalizar nombres temporales

A veces es posible que desee un elemento de previsibilidad incluso en los nombres de archivos generados de forma pseudoaleatoria. Puede personalizar los nombres de sus archivos temporales con ambos comandos.

Con mktemp, puedes agregar un sufijo a tu nombre de archivo:

$ mktemp -p ~/Demo/ --suffix .mine
/home/tux/Demo/tmp.dufLYfwJLO.mine

Con tempfile, puedes establecer un prefijo y un sufijo:

$ tempfile --directory ~/Demo/ \
--prefix tt_ --suffix .mine
/home/tux/Demo/tt_0dfu5q.mine

Archivo temporal como toque

También puedes establecer un nombre personalizado con tempfile:

$ tempfile --name not_random
not_random

Cuando usas la opción --name, es absoluta, ignorando todas las demás formas de personalización. De hecho, incluso ignora la opción --directory:

$ tempfile --directory ~/Demo \
--prefix this_is_ --suffix .all \
--name not_random_at
not_random_at

En cierto modo, tempfile puede ser un sustituto de touch y test porque se niega a crear un archivo que ya existe:

$ tempfile --name example.txt
open: file exists

El comando tempfile no está instalado en todas las distribuciones de Linux de forma predeterminada, por lo que debe asegurarse de que exista antes de usarlo como un truco para test en un script.

Instalar mktemp y tempfile

GNU Core Utils incluye el comando mktemp. Las distribuciones principales incluyen Core Utils de forma predeterminada (es el mismo paquete que contiene chmod, cut, du y otros comandos esenciales).

El paquete Debian Utils incluye el comando tempfile y se instala de forma predeterminada en la mayoría de las distribuciones basadas en Debian y Slackware Linux.

Envolver

Los archivos temporales son convenientes porque no hay confusión sobre si es seguro eliminarlos. Son temporales, están destinados a usarse según sea necesario y descartarse sin pensarlo dos veces. Úsalos cuando los necesites y límpialos cuando hayas terminado.

Artículos relacionados: