Cómo buscar un archivo con nombre numérico y, si existe, copiarlo con un nuevo nombre usando el siguiente número secuencial

Cómo buscar un archivo con nombre numérico y, si existe, copiarlo con un nuevo nombre usando el siguiente número secuencial

Primero quiero disculparme por mi falta de conocimiento; Este es, literalmente, mi primer script bash y mis conocimientos de Linux son básicamente inexistentes. Se agradecerían mucho respuestas explicativas; Me gustaría aprender el por qué y no sólo el cómo.

Estoy intentando escribir un script para automatizar un proceso tedioso que debe realizarse varias veces al día. En resumen, este script debería preparar un conjunto de archivos en función de ciertos requisitos. El script debe mover un archivo de plantilla y asignarle un número de versión, o copiar un archivo existente usando un nuevo número de versión, basándose en lo que se encuentra dentro de un directorio en particular (por ejemplo, crear si está vacío, copiar si hay algo allí).

Como ejemplo, el archivo podría llamarse

AAAAMMDD_##_nombredeusuario_testfile.json

donde ## (número de versión) debe ser 01 para la primera creación, luego 02 para la copia, 03 para la copia posterior, etc. Un solo directorio podría contener más de 10 de estos archivos, todos con fechas diferentes y secuenciales. números de versión, así como otros archivos que usan el mismo formato pero que terminan en algo distinto a testfile.json

Parece que no puedo encontrar una manera de hacer que el script busque en el directorio "prueba" el archivo que termina en testfile.json que tiene el número de versión más alto y, si lo encuentra, extrae el número de versión como una variable/parámetro que puedo pasar. de nuevo a la secuencia cp.

En este punto ni siquiera estoy seguro de qué comando usar; Internet ha ofrecido de todo, desde grep hasta awk, pasando por listados y clasificaciones... ¡mi cabeza da vueltas!

Cualquier ayuda sería apreciada. He eliminado toda la información de identificación. Avíseme si necesita más información.

Respuesta1

Dividámoslo en una serie de pasos.

Vamos a escribir una función que devolverá el siguiente número. Apuntaremos a la simplicidad, más que a la máxima eficiencia.

Necesitas darle un nombre de directorio.

Necesitas darle la testfile.jsonparte del nombre del archivo.

Necesitamos encontrar todos los archivos en ese directorio que terminen con esa terminación.

Los parámetros se pasan a una función usando $1, $2, etc.

getnum(){
  ls "$1" | grep "$2\$"
}

Utilice cortar para extraer solo el segundo campo, utilizándolo _como delimitador. (Tenga en cuenta que si hiciera esto, usaría sed en lugar de grep y cut, otros podrían usar awk, pero aquí buscamos simplicidad).

getnum() {
 ls "$1" | grep "$2\$" | cut -d_ -f 2
}

Utilice ordenar para ordenarlos numéricamente

getnum() {
  ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n
}

Use head para obtener solo el primer valor

 getnum() {
  ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1
 }

Resuma esto para que obtengamos el valor en una variable local

getnum() {
      local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
}

Si no había valores, establezca el valor anterior en 0. Imprima un número de 2 dígitos que sea uno más que el anterior.

 getnum() {
  local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
  if [ "$oldnum" = "" ]
  then
      oldnum=0
  fi
  printf "%02d\n" $(($oldnum+1))
 }

Tenga en cuenta que podría haber omitido la prueba para que oldnum no esté configurado, como $((oldnum+1))se expandiría $((+1))en ese caso. También puedo usar expresiones como $((${oldnum:-0}+1)), consulta los manuales para más información.

Entonces podrías usar una función como esta

  dir=somewhere/logs
  ext=testfile.json
  cp template "$dir/$(date +%Y%m%d_)$(getnum "$dir" "$ext")_$USER_$ext"

información relacionada