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

Renaming multiple files in a nested structure

我有一个结构如下的目录:

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

试试这个命令:

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

使用的选项:

  • -type f指定文件或目录。
  • -name "*.csv" 仅匹配扩展名为 csv
  • 的文件
  • -exec\-execdir 执行命令,在本例中,perl-rename
  • 's/_\d+(\.csv)//g' 搜索像 _20181234.csv 这样的字符串并替换为 .csv</code> 表示找到第一组。</li> </ul> <p><strong>注意</strong></p> <p>取决于您的 S.O。您可以只使用 <code>rename 而不是 perl-rename

使用一些 shell 循环:

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

在现代 shells ** 是一个匹配层次结构中多个目录的通配符,是 find 的替代方案,这也是一个很好的解决方案。我不确定这是否应该改为 /**/*.csv/root/**/*.csv 基于你提供的树,所以我把 echo 放在 'mv' 之前看看它是什么做。确保这将执行您期望的操作后,删除 echo.