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 find
comando que busca files
recursivamente desde el directorio actual en adelante y que tiene el nombre cpu.csv
y recopila y envía los nombres recopilados en un grupo al sh
comando. En el interior, sh
configuramos un for
bucle que iterará sobre los argumentos de la línea de comando sh
y buscará la presencia de, http.csv
en cuyo caso se cambiará el nombre de cpu.csv a cpu_http.csv. Lo mismo ocurre con el otro caso.