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 find
Befehl ein, der rekursiv ab dem aktuellen Verzeichnis nach sucht files
und den Namen hat cpu.csv
und die gesammelten Namen sammelt und in einer Reihe an den sh
Befehl sendet. Darin sh
richten wir eine for
Schleife ein, die über die Befehlszeilenargumente iteriert sh
und nach dem Vorhandensein von sucht, http.csv
in welchem Fall die cpu.csv in cpu_http.csv umbenannt wird. Gleiches gilt für den anderen Fall.