代码之家  ›  专栏  ›  技术社区  ›  Jsevillamol

在嵌套结构中重命名多个文件

  •  -1
  • Jsevillamol  · 技术社区  · 6 年前

    我有一个具有这种结构的目录:

    root
    |-dir1
    | |-pred_20181231.csv
    |
    |-dir2
    | |-pred_20181234.csv
    ...
    |-dir84
      |-pred_2018123256.csv
    

    我想运行一个命令,该命令将重命名所有 pred_XXX.csv 文件到 pred.csv .

    我怎么能轻易做到呢?

    我已经调查了 rename facility 但我不理解Perl表达式语法。

    编辑:我尝试使用此代码: rename -n 's/\training_*.csv$/\training_history.csv/' *.csv 但它不起作用

    2 回复  |  直到 6 年前
        1
  •  0
  •   Perette    6 年前

    使用一些shell循环:

    for file in **/*.csv
    do
        echo mv "$(dirname "$file")/$(basename "$file")" "$(dirname "$file")/pred.csv"
    done
    

    在现代贝壳上 ** 是匹配层次结构中多个目录的通配符,它是 find 这也是一个很好的解决方案。我不确定这是否应该 /**/*.csv /root/**/*.csv 根据你提供的树,我把 echo 在“MV”之前看看它会做什么。在确定这将执行预期的操作后,删除 回声 .

        2
  •  4
  •   Joaquin    6 年前

    尝试使用此命令:

    find root -type f -name "*.csv" -exec perl-rename 's/_\d+(\.csv)/$1/g' '{}' \;
    

    使用的选项 :

    • -type f 指定文件或目录。
    • -name "*.csv" 只匹配扩展名为的文件 csv
    • -exec\-execdir 要执行命令,在这种情况下, perl-rename
    • 's/_\d+(\.csv)/$1/g' 像这样搜索字符串 _20181234.csv 换成 .csv , $1 表示找到第一个组。

    注释

    根据你的S.O.你可以使用 rename 而不是 Perl重命名 .