現在のシナリオでは、複数のフォルダーがあり、各フォルダーにはトラフィック タイプ (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_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