根据另一个文件的存在重命名文件夹中的文件

根据另一个文件的存在重命名文件夹中的文件

我当前的情况是,我有多个文件夹,每个文件夹都有流量类型(如 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。对于其他情况也是如此。

相关内容