Umbenennen einer Datei in einem Ordner basierend auf dem Vorhandensein einer anderen Datei

Umbenennen einer Datei in einem Ordner basierend auf dem Vorhandensein einer anderen Datei

Mein aktuelles Szenario ist folgendes: Ich habe mehrere Ordner und jeder Ordner hat einen Verkehrstyp (wie ftp.csv, http.csv usw.) und Metriken (cpu.csv und memory.csv).

Ordner1> cpu.csv http.csv

Ordner2> cpu.csv ftp.csv

Da die Metrikdatei in allen Ordnern denselben Namen hat, z. B. cpu.csv, möchte ich cpu.csv im Ordner mit ftp.csv in cpu_ftp.csv umbenennen und im Ordner mit http.csv möchte ich cpu.csv in cpu_http.csv verschieben.

Ich möchte wie folgt verschieben Ordner1> cpu_http.csv http.csv

Helfen Sie mir bitte, dies im Bash-Skript zu erreichen.

Antwort1

MitSchlag:

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

Antwort2

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

Wir richten einen findBefehl ein, der rekursiv ab dem aktuellen Verzeichnis nach sucht filesund den Namen hat cpu.csvund die gesammelten Namen sammelt und in einer Reihe an den shBefehl sendet. Darin shrichten wir eine forSchleife ein, die über die Befehlszeilenargumente iteriert shund nach dem Vorhandensein von sucht, http.csvin welchem ​​Fall die cpu.csv in cpu_http.csv umbenannt wird. Gleiches gilt für den anderen Fall.

verwandte Informationen