Переименовать файл в папке на основе наличия другого файла

Переименовать файл в папке на основе наличия другого файла

В настоящее время у меня есть несколько папок, и каждая папка имеет тип трафика (например, ftp.csv, http.csv и т. д.) и метрики (cpu.csv и memory.csv).

папка1> cpu.csv http.csv

папка2> cpu.csv ftp.csv

Поскольку файл метрик имеет одинаковое имя во всех папках, например, cpu.csv, я хочу переименовать cpu.csv в папке, содержащей ftp.csv, в cpu_ftp.csv, а в папке http.csv я хочу переместить cpu.csv в cpu_http.csv.

Я хочу переместить вот так папку 1> cpu_http.csv http.csv

Пожалуйста, помогите мне реализовать это в скрипте bash?

решение1

СБаш:

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

решение2

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 {} +

Мы настраиваем findкоманду, которая ищет filesрекурсивно от текущего каталога и далее, и которые имеют имя cpu.csv, и собираем и отправляем собранные имена в кучу shкоманде. Внутри shмы настраиваем forцикл, который будет перебирать аргументы командной строки для shи искать наличие , http.csvв этом случае cpu.csv будет переименован в cpu_http.csv. Аналогично для другого случая.

Связанный контент