Renomeie um arquivo em uma pasta com base na presença de outro arquivo

Renomeie um arquivo em uma pasta com base na presença de outro arquivo

O cenário que tenho atualmente é: tenho várias pastas e cada pasta tem tipo de tráfego (como ftp.csv, http.csv etc) e métricas (cpu.csv e memory.csv).

pasta1> cpu.csv http.csv

pasta2> cpu.csv ftp.csv

Como o arquivo de métricas tem o mesmo nome em todas as pastas, digamos, cpu.csv, quero renomear cpu.csv na pasta que contém ftp.csv para cpu_ftp.csv e na pasta http.csv, quero mover cpu .csv em cpu_http.csv

Quero mover como a seguinte pasta1> cpu_http.csv http.csv

Por favor me ajude a conseguir no script bash?

Responder1

Comfesta:

#!/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

Responder2

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 um findcomando que procura filesrecursivamente a partir do diretório atual e que tem o nome cpu.csve coleta e envia os nomes coletados em grupo para o shcomando. Dentro, shconfiguramos um forloop que deve iterar sobre os argumentos da linha de comando para she procurar a presença de, http.csvcaso em que cpu.csv será renomeado para cpu_http.csv. Da mesma forma para o outro caso.

informação relacionada