현재 상황은 트래픽 유형(ftp.csv, http.csv 등)과 메트릭(cpu.csv 및 memory.csv)이 포함된 여러 폴더가 있다는 것입니다.
폴더 1> cpu.csv http.csv
폴더 2> cpu.csv ftp.csv
모든 폴더의 표시기 파일은 동일한 이름(예: cpu.csv)을 가지므로 ftp.csv가 포함된 폴더의 cpu.csv 이름을 cpu_ftp.csv로 바꾸고 http.csv 폴더의 cpu.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
설정합니다 . 이 경우 cpu.csv의 이름은 cpu_http.csv로 변경됩니다. 다른 상황에서도 마찬가지입니다.for
sh
http.csv