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

时间:2018-12-30 16:50:00

标签: bash rename file-rename

我有一个具有以下结构的目录:

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 个答案:

答案 0 :(得分:4)

尝试使用此命令:

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

答案 1 :(得分:0)

使用一些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