bash - 如何使用 bash 字符串格式化来反转日期格式?
问题描述
我有很多文件被命名为:MM-DD-YYYY.pdf
. 我想重命名它们,因为YYYY-MM-DD.pdf
我确信有一些 bash 魔法可以做到这一点。它是什么?
解决方案
对于当前目录中的文件:
for name in ./??-??-????.pdf; do
if [[ "$name" =~ (.*)/([0-9]{2})-([0-9]{2})-([0-9]{4})\.pdf ]]; then
echo mv "$name" "${BASH_REMATCH[1]}/${BASH_REMATCH[4]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]}.pdf"
fi
done
递归地,在当前目录中或下:
find . -type f -name '??-??-????.pdf' -exec bash -c '
for name do
if [[ "$name" =~ (.*)/([0-9]{2})-([0-9]{2})-([0-9]{4})\.pdf ]]; then
echo mv "$name" "${BASH_REMATCH[1]}/${BASH_REMATCH[4]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]}.pdf"
fi
done' bash {} +
启用globstar
shell 选项bash
可以让我们执行以下操作(也将像上面的解决方案一样,处理当前目录中或之下的所有文件):
shopt -s globstar
for name in **/??-??-????.pdf; do
if [[ "$name" =~ (.*)/([0-9]{2})-([0-9]{2})-([0-9]{4})\.pdf ]]; then
echo mv "$name" "${BASH_REMATCH[1]}/${BASH_REMATCH[4]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]}.pdf"
fi
done
所有这三个解决方案都使用正则表达式来挑选文件名的相关部分,然后将这些部分重新排列为新名称。它们之间的唯一区别是如何生成路径名列表。
代码前缀mv
为echo
安全起见。要实际重命名文件,请删除echo
(但至少运行一次以 echo
查看它是否符合您的要求)。
推荐阅读
- jquery - Rails, Sentry 报错获取 API 的响应,这在包括 instagram 浏览器在内的某些浏览器中是不允许的
- php - 如何在 Laravel 5.4 中以优化的方式保存用户访问
- sql - 存储过程参数“NULL”或“= NULL”
- php - 在php laravel中使用ajax上传图像并存储在数据库中
- math - 如何根据点计算圆的起点和终点
- javascript - 根据单数或复数添加后缀
- excel - With函数VBA中的多对象表达式
- javascript - 用于验证字符串的正则表达式,确保单词仅由一个特殊符号分隔
- c++ - 初始化用户定义类的指针向量
- wpf - 自定义控件在xaml中使用时如何设置DP值?(声明时)