![別のファイルがあるかどうかに応じてフォルダのファイル名を変更する[閉じる]](https://linux33.com/image/112225/%E5%88%A5%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E3%81%82%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
現在の状況は、トラフィックの種類(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