Línea de comando: cree un archivo con un nuevo nombre de archivo si el nombre de archivo ya existe

8

Me preguntaba si era posible tener un comando que creara un archivo, pero cada vez que se ejecuta el comando, no sobrescribirá el archivo creado en la ejecución anterior.

Por ejemplo: touch test1.txtcrearía 1 archivo llamado test1.txt. Pero la próxima vez que lo ejecute, me gustaría llamar al nuevo archivo test2.txt, o algo así. Entonces, sin sobrescribir el archivo ya existente. En cierto modo, podría ejecutarse varias veces sin problemas.

No me malinterpreten, no estoy tratando de crear varios archivos con un solo comando.

¡Gracias por adelantado!

Nick Lemaire
fuente

Respuestas:

9

La solución más fácil sería agregar una marca de tiempo al nombre del archivo y no usar un solo dígito.

El método más fácil para crear un archivo vacío sería touch test$(date +%Y%m%d-%H%M%S)y eso daría como resultado un archivo llamado test20110802-170410. Una segunda vez test*obtendrá una marca de tiempo más nueva, por lo que dará como resultado 2 archivos.

Rinzwind
fuente
Esto es justo lo que estaba buscando, ¡gracias! :)
Nick Lemaire
No funciona en un script (sin esperar entre): lo intenté touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S), creó solo un archivo. El tiempo de nanosegundos funciona: touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)y touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)crea dos archivos cada uno.
Volker Siegel
Es mejor usar $()ya que permite anidar expresiones, pero también se puede usar acentos abiertos: touch test`date +%Y%m%d-%H%M%S`.
Pablo Bianchi
5

Dudo que exista un comando general para hacer eso, pero puedes pensar en algo como esto:

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
}

El parámetro de entrada para la función se divide en prefijo, número, sufijo, luego, hasta que exista el archivo, el número se incrementa. Encontrado un espacio libre, el archivo se crea con touch.

El mecanismo de división se debe adaptar a sus necesidades y se deben agregar varios controles de error.

enzotib
fuente
Brillante, gran función.
Marco Ceppi
1

Si no se requieren números de secuencia, entonces la forma más fácil es usar el mktempcomando.

Michał Šrajer
fuente
mktemp genera un nombre de archivo aleatorio y único, usando una plantilla. Probablemente capturaría la salida de mktemp en una variable. De linuxmanpages :TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan
Otro método común es utilizar la identificación del proceso actual, desde la variable de shell $$:TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan