Ligne de commande: créer un fichier avec un nouveau nom de fichier si le nom de fichier existe déjà

8

Je me demandais s'il était possible d'avoir une commande qui crée un fichier, mais chaque fois que la commande est exécutée, elle n'écraserait pas le fichier créé lors de l'exécution précédente.

Par exemple: touch test1.txtcréerait 1 fichier appelé test1.txt. Mais la prochaine fois que je l'exécuterai, j'aimerais que le nouveau fichier soit appelé test2.txt, ou quelque chose comme ça. Donc sans écraser le fichier déjà existant. D'une certaine manière, il pourrait être exécuté plusieurs fois sans problème.

Ne vous méprenez pas, je n'essaye pas de créer plusieurs fichiers avec une seule commande.

Merci d'avance!

Nick Lemaire
la source

Réponses:

9

La solution la plus simple serait d'ajouter un horodatage au nom de fichier et de ne pas utiliser un seul chiffre.

La méthode la plus simple pour créer un fichier vide serait touch test$(date +%Y%m%d-%H%M%S)et cela donnerait un fichier nommé test20110802-170410. Une deuxième fois test*obtiendra un horodatage plus récent, ce qui entraînera la création de 2 fichiers.

Rinzwind
la source
C'est exactement ce que je cherchais, merci! :)
Nick Lemaire
Ne fonctionne pas dans un script (pas d'attente entre) - J'ai essayé touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S), il n'a créé qu'un seul fichier. Nanosecondes temps fonctionne: touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)et touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)créer deux fichiers chacun.
Volker Siegel
Est -ce préférable d'utiliser $()puisque vous permet d'expressions de nid, mais vous pouvez également utiliser des apostrophes inverses: touch test`date +%Y%m%d-%H%M%S`.
Pablo Bianchi
5

Je doute qu'il existe une commande générale pour le faire, mais vous pouvez penser à quelque chose comme ça:

create() {
  read prefix number suffix < <(sed -r 's/(.*)([0-9]+)\.(.*)$/\1 \2 \3/' <<<"$1")
  while true; do
    file="$prefix$number.$suffix"
    if [[ -e "$file" ]]; then
      ((number++))
    else
      touch "$file"
      break
    fi
  done
}

Le paramètre d'entrée de la fonction est divisé en préfixe, nombre, suffixe, puis jusqu'à ce que le fichier existe, le nombre est incrémenté. Trouvé un emplacement libre, le fichier est créé avec touch.

Le mécanisme de partage doit être adapté à vos besoins et divers contrôles d'erreur doivent être ajoutés.

enzotib
la source
brillant, grande fonction.
Marco Ceppi
1

Si les numéros de séquence ne sont pas requis, la façon la plus simple consiste à utiliser la mktempcommande.

Michał Šrajer
la source
mktemp génère un nom de fichier aléatoire et unique, à l'aide d'un modèle. Vous captureriez probablement la sortie de mktemp dans une variable. De linuxmanpages :TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan
Une autre méthode courante consiste à utiliser l'ID de processus actuel, à partir de la variable shell $$:TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan