web-dev-qa-db-fra.com

Comment créer un répertoire temporaire?

J'utilise pour créer un tempfile, le supprimer et le recréer comme un répertoire:

tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"

Le problème est qu’un autre processus peut avoir le même nom X s’il exécute accidentellement le fichier temporaire après un processus rm -f X et juste avant mkdir X.

210
Xiè Jìléi

Utilisez mktemp -d . Il crée un répertoire temporaire avec un nom aléatoire et s'assure que ce fichier n'existe pas déjà. Vous devez cependant vous rappeler de supprimer le répertoire après l'avoir utilisé.

319
marcog

Pour une solution plus robuste, j'utilise quelque chose comme ce qui suit. Ainsi, le répertoire temporaire sera toujours supprimé une fois le script terminé.

La fonction de nettoyage est exécutée sur le signal EXIT. Cela garantit que la fonction de nettoyage est toujours appelée, même si le script est abandonné quelque part.

#!/bin/bash    

# the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in the default location
WORK_DIR=`mktemp -d -p "$DIR"`

# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
  echo "Could not create temp dir"
  exit 1
fi

# deletes the temp directory
function cleanup {      
  rm -rf "$WORK_DIR"
  echo "Deleted temp working directory $WORK_DIR"
}

# register the cleanup function to be called on the EXIT signal
trap cleanup EXIT

# implementation of script starts here
...

Répertoire du script bash de ici .

Bash pièges .

66
Ortwin Angermeier

Mon one-liner préféré pour cela est

cd $(mktemp -d)
56
Emmett Butler

L'extrait de code suivant crée en toute sécurité un répertoire temporaire (-d) et enregistre son nom dans le fichier TMPDIR. (Un exemple d'utilisation de la variable TMPDIR apparaît dans la suite du code, où il est utilisé pour stocker les fichiers d'origine qui seront éventuellement modifiés.)

La première ligne trap exécute la commande exit 1 quand l'un des signaux spécifiés est reçu. La deuxième ligne trap supprime (nettoie) le $TMPDIR à la sortie du programme (normal et anormal). Nous initialisons ces traps après avoir vérifié que mkdir -d réussissait à éviter d'exécuter accidentellement le piège de sortie avec $TMPDIR dans un état inconnu.

#!/bin/bash

# Create a temporary directory and store its name in a variable ...
TMPDIR=$(mktemp -d)

# Bail out if the temp directory wasn't created successfully.
if [ ! -e $TMPDIR ]; then
    >&2 echo "Failed to create temp directory"
    exit 1
fi

# Make sure it gets removed even if the script exits abnormally.
trap "exit 1"           HUP INT PIPE QUIT TERM
trap 'rm -rf "$TMPDIR"' EXIT

# Example use of TMPDIR:
for f in *.csv; do
    cp "$f" "$TMPDIR"
    # remove duplicate lines but keep order
    Perl -ne 'print if ++$k{$_}==1' "$TMPDIR/$f" > "$f"
done
9
jreisinger