我当前的情况是,我有多个文件夹,每个文件夹都有流量类型(如 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
我们设置了一个for
循环,它将迭代命令行参数sh
并查找是否存在,http.csv
在这种情况下,cpu.csv 将被重命名为 cpu_http.csv。对于其他情况也是如此。