【问题标题】:Renaming multiple files in a nested structure重命名嵌套结构中的多个文件
【发布时间】:2019-05-27 12:29:34
【问题描述】:

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

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 但它不起作用

【问题讨论】:

标签: bash rename file-rename


【解决方案1】:

试试这个命令:

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-rename

【讨论】:

    【解决方案2】:

    使用一些 shell 循环:

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

    在现代 shell 上,** 是一个通配符,它​​匹配层次结构中的多个目录,是 find 的替代品,这也是一个很好的解决方案。根据您提供的树,我不确定这是否应该是 /**/*.csv/root/**/*.csv,所以我将 echo 放在“mv”之前,看看它会做什么。在确保这将按照您的预期进行后,删除 echo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2018-05-02
      相关资源
      最近更新 更多