【问题标题】: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。