Cambiar el nombre de un archivo en una carpeta según la presencia de otro archivo

Cambiar el nombre de un archivo en una carpeta según la presencia de otro archivo

El escenario que tengo actualmente es que tengo varias carpetas y cada carpeta tiene un tipo de tráfico (como ftp.csv, http.csv, etc.) y métricas (cpu.csv y memoria.csv).

carpeta1> cpu.csv http.csv

carpeta2> cpu.csv ftp.csv

Como el archivo de métricas tiene el mismo nombre en todas las carpetas, digamos, cpu.csv, quiero cambiar el nombre de cpu.csv en la carpeta que contiene ftp.csv a cpu_ftp.csv y en la carpeta http.csv, quiero mover la CPU. .csv en cpu_http.csv

Quiero moverme como la siguiente carpeta1> cpu_http.csv http.csv

¿Por favor ayúdenme a lograrlo en el script bash?

Respuesta1

Conintento:

#!/bin/bash

for d in /folder[0-9]*
do
    type=""   # traffic type (either `http` or `ftp`)
    if [ -f "$d/ftp.csv" ]; then     # check if file `ftp.csv` exists within a folder
        type="ftp"
    elif [ -f "$d/http.csv" ]; then  # check if file `http.csv` exists within a folder
        type="http"
    fi
    # if `traffic type` was set and file `cpu.csv` exists - rename the file
    if [ ! -z "$type" ] && [ -f "$d/cpu.csv" ]; then
        mv "$d/cpu.csv" "$d/cpu_$type.csv"
    fi        
done

Respuesta2

find . -type f -name cpu.csv -exec sh -c '
   for f
   do
      [ -f ${f%/*}/http.csv ] && { mv "$f" "${f%.???}_http.csv"; :; } \
                      || \
      [ -f  ${f%/*}/ftp.csv ] &&   mv "$f" "${f%.???}_ftp.csv"
   done
' sh {} +

Configuramos un findcomando que busca filesrecursivamente desde el directorio actual en adelante y que tiene el nombre cpu.csvy recopila y envía los nombres recopilados en un grupo al shcomando. En el interior, shconfiguramos un forbucle que iterará sobre los argumentos de la línea de comando shy buscará la presencia de, http.csven cuyo caso se cambiará el nombre de cpu.csv a cpu_http.csv. Lo mismo ocurre con el otro caso.

información relacionada