我有一个具有以下结构的目录:
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
,但没有用
答案 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
。